/*++ Copyright (c) 1995 Microsoft Corporation Module Name: ntos\tdi\isn\flt\fwdbind.c Abstract: IPX Filter driver binding with forwarder routines Author: Vadim Eydelman Revision History: --*/ #include "precomp.h" // Buffer to keep forwarder entry points IPX_FLT_BIND_OUTPUT FltBindOutput; // global handle of the FWD driver HANDLE HdlFwdFile = NULL; /*++ B i n d T o F w d D r i v e r Routine Description: Opens forwarder driver and exchages entry points Arguments: None Return Value: STATUS_SUCCESS if successful, STATUS_UNSUCCESSFUL otherwise --*/ NTSTATUS BindToFwdDriver ( KPROCESSOR_MODE requestorMode ) { NTSTATUS status; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING UstrFwdFileName; IPX_FLT_BIND_INPUT FltBindInput = {Filter, InterfaceDeleted}; ASSERT (HdlFwdFile == NULL); RtlInitUnicodeString (&UstrFwdFileName, IPXFWD_NAME); InitializeObjectAttributes( &ObjectAttributes, &UstrFwdFileName, OBJ_CASE_INSENSITIVE, NULL, NULL ); if (requestorMode==UserMode) status = ZwCreateFile(&HdlFwdFile, SYNCHRONIZE | GENERIC_READ, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0L); else status = NtCreateFile(&HdlFwdFile, SYNCHRONIZE | GENERIC_READ, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0L); if (NT_SUCCESS(status)) { if (requestorMode==UserMode) status = ZwDeviceIoControlFile( HdlFwdFile, // HANDLE to File NULL, // HANDLE to Event NULL, // ApcRoutine NULL, // ApcContext &IoStatusBlock, // IO_STATUS_BLOCK IOCTL_FWD_INTERNAL_BIND_FILTER, // IoControlCode &FltBindInput, // Input Buffer sizeof(FltBindInput), // Input Buffer Length &FltBindOutput, // Output Buffer sizeof(FltBindOutput));// Output Buffer Length else status = NtDeviceIoControlFile( HdlFwdFile, // HANDLE to File NULL, // HANDLE to Event NULL, // ApcRoutine NULL, // ApcContext &IoStatusBlock, // IO_STATUS_BLOCK IOCTL_FWD_INTERNAL_BIND_FILTER, // IoControlCode &FltBindInput, // Input Buffer sizeof(FltBindInput), // Input Buffer Length &FltBindOutput, // Output Buffer sizeof(FltBindOutput));// Output Buffer Length if (NT_SUCCESS (status)) return STATUS_SUCCESS; else IpxFltDbgPrint (DBG_ERRORS, ("IpxFlt: Failed to bind to forwarder %08lx.\n", status)); if (requestorMode==KernelMode) ZwClose (HdlFwdFile); else NtClose (HdlFwdFile); } else IpxFltDbgPrint (DBG_ERRORS, ("IpxFlt: Failed create forwarder file %08lx.\n", status)); HdlFwdFile = NULL; return status; } /*++ U n i n d T o F w d D r i v e r Routine Description: Closes forwarder driver Arguments: None Return Value: None --*/ VOID UnbindFromFwdDriver ( KPROCESSOR_MODE requestorMode ) { NTSTATUS status; ASSERT (HdlFwdFile != NULL); if (requestorMode==UserMode) status = ZwClose (HdlFwdFile); else status = NtClose (HdlFwdFile); ASSERT (NT_SUCCESS (status)); HdlFwdFile = NULL; }