windows-nt/Source/XPSP1/NT/net/sockets/winsock2/ws2help/ws2ifsl/driver.c
2020-09-26 16:20:57 +08:00

178 lines
4.1 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
driver.c
Abstract:
This module contains the driver entry and unload routines
for ws2ifsl.sys driver.
Author:
Vadim Eydelman (VadimE) Dec-1996
Revision History:
--*/
#include "precomp.h"
// Local routine declarations
NTSTATUS
DriverEntry (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS
DriverUnload (
IN PDRIVER_OBJECT DriverObject
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry )
#pragma alloc_text(PAGE, DriverUnload)
#endif
PDEVICE_OBJECT DeviceObject;
FAST_IO_DISPATCH FastIoDispatchTable = {
sizeof (FAST_IO_DISPATCH), // SizeOfFastIoDispatch
NULL, // FastIoCheckIfPossible
NULL, // FastIoRead
NULL, // FastIoWrite
NULL, // FastIoQueryBasicInfo
NULL, // FastIoQueryStandardInfo
NULL, // FastIoLock
NULL, // FastIoUnlockSingle
NULL, // FastIoUnlockAll
NULL, // FastIoUnlockAllByKey
FastIoDeviceControl // FastIoDeviceControl
};
NTSTATUS
DriverEntry (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
/*++
Routine Description:
This is the initialization routine for the ws2ifsl device driver.
Arguments:
DriverObject - Pointer to driver object created by the system.
RegistryPath - path to driver's registry ley
Return Value:
Final status from the initialization operation.
--*/
{
NTSTATUS status;
UNICODE_STRING deviceName;
PAGED_CODE( );
#if DBG
ReadDbgInfo (RegistryPath);
#endif
//
// Create the device object. (IoCreateDevice zeroes the memory
// occupied by the object.)
//
RtlInitUnicodeString( &deviceName, WS2IFSL_DEVICE_NAME );
status = IoCreateDevice(
DriverObject, // DriverObject
0, // DeviceExtension
&deviceName, // DeviceName
FILE_DEVICE_WS2IFSL, // DeviceType
0, // DeviceCharacteristics
FALSE, // Exclusive
&DeviceObject // DeviceObject
);
if (NT_SUCCESS(status)) {
// Initialize device object
// DeviceObject->Flags |= 0; // Neither direct nor buffering
DeviceObject->StackSize = 1; // No underlying drivers
//
// Initialize the driver object.
//
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCleanup;
DriverObject->MajorFunction[IRP_MJ_READ] =
DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnP;
DriverObject->DriverUnload = DriverUnload;
DriverObject->FastIoDispatch = &FastIoDispatchTable;
//
// Initialize global data.
//
WsPrint (DBG_LOAD, ("WS2IFSL DriverEntry: driver loaded OK\n"));
return STATUS_SUCCESS;
}
else {
WsPrint (DBG_FAILURES|DBG_LOAD,
("WS2IFSL DriverEntry: unable to create device object: %X\n",
status ));
}
return status;
} // DriverEntry
NTSTATUS
DriverUnload (
IN PDRIVER_OBJECT DriverObject
)
/*++
Routine Description:
This routine releases all resources allocated by the driver
when it is unloaded.
Arguments:
DriverObject - Pointer to driver object created by the system.
Return Value:
STATUS_SUCCESS
--*/
{
PAGED_CODE( );
// Release global resources
IoDeleteDevice (DeviceObject);
WsPrint (DBG_LOAD, ("WS2IFSL DriverUnload: driver unloaded OK\n"));
return STATUS_SUCCESS;
} // DriverUnload