NT4/private/ntos/tdi/isn/flt/fwdbind.c
2020-09-30 17:12:29 +02:00

162 lines
3.4 KiB
C

/*++
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;
}