// =================================================================== // // // test98.c // // rev 1.0 beta // // USB device driver for USB Device Example as depicted in // the book "Developing USB PC Peripherals" // // kernel mode driver // // author : Wooi Ming Tan // date : 31 May 98 // // test98.c - main module containing DriverEntry routine // testpnp.c - handles USB PnP and power IRPs // testusb.c - handles some USB IRPs // // developed under // - Windows 98 Beta 3 DDK environment // - users can create and copy to \98DDK\src\usb\test98\sys directory // // NOTE: // The driver (testdrv.sys) generated by the codes (test98.c, testpnp.c and // testusb.c) has been tested under a few Windows 98 Beta 3 systems. // The driver has been made compatible with the applications software and // device firmware supplied with the book "Developing USB PC Peripherals". // For more information on the code examples, please also refer to // Chapter 8 "USB Application Software, WDM Driver, and Firmware Examples" // of the book. // // The author would also like to thank Kenneth Ray for his // advice on revising the code. // // // ============================================================================== #include #include #include "test98.h" #include "stdio.h" #include "testdrv.h" NTSTATUS DriverEntry (PDRIVER_OBJECT, PUNICODE_STRING); NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING UniRegistryPath ) /* Entry point for the loading of the drivr. */ { PDEVICE_OBJECT device; UNREFERENCED_PARAMETER (UniRegistryPath); DriverObject->MajorFunction [IRP_MJ_CREATE] = DriverObject->MajorFunction [IRP_MJ_CLOSE] = Test_Create; // routines to handle system PnP and power management reqeusts DriverObject->MajorFunction [IRP_MJ_PNP] = Test98_PnP; DriverObject->MajorFunction [IRP_MJ_POWER] = Test98_Power; // handles user mode DeviceIoControl() calls DriverObject->MajorFunction [IRP_MJ_DEVICE_CONTROL] = Test_ProcessIOCTL; DriverObject->DriverUnload = Test98_DriverUnload; // called when device plug-in to reat Funtional Device Object (FDO) DriverObject->DriverExtension->AddDevice = Test98_AddDevice; DriverObject->MajorFunction[IRP_MJ_WRITE] = Test_Write; DriverObject->MajorFunction[IRP_MJ_READ] = Test_Read; return STATUS_SUCCESS; } // ======================================================================= VOID Test98_DriverUnload ( IN PDRIVER_OBJECT Driver ) /* to clean up the stuff we did in driver entry. */ { UNREFERENCED_PARAMETER (Driver); PAGED_CODE(); ASSERT (NULL == Driver->DeviceObject); // // Here we free any resources allocated in DriverEntry // return; } // ======================================================================= VOID Test98_DecIoCount ( PFDO_DEVICE_DATA Data ) { if (0 == InterlockedDecrement (&Data->OutstandingIO)) { KeSetEvent (&Data->RemoveEvent, 0, FALSE); } } // ======================================================================= NTSTATUS Test98_IncIoCount ( PFDO_DEVICE_DATA Data ) { InterlockedIncrement (&Data->OutstandingIO); if (Data->Removed) { if (0 == InterlockedDecrement (&Data->OutstandingIO)) { KeSetEvent (&Data->RemoveEvent, 0, FALSE); } return STATUS_DELETE_PENDING; } return STATUS_SUCCESS; }