210 lines
7 KiB
C
210 lines
7 KiB
C
|
/***************************************************************************
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
Dot4Usb.sys - Lower Filter Driver for Dot4.sys for USB connected
|
|||
|
IEEE 1284.4 devices.
|
|||
|
|
|||
|
File Name:
|
|||
|
|
|||
|
InitUnld.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Driver globals, initialization (DriverEntry) and Unload routines
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode only
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|||
|
PURPOSE.
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation. All Rights Reserved.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
01/18/2000 : created
|
|||
|
|
|||
|
ToDo in this file:
|
|||
|
|
|||
|
- code review w/Joby
|
|||
|
|
|||
|
Author(s):
|
|||
|
|
|||
|
Doug Fritz (DFritz)
|
|||
|
Joby Lafky (JobyL)
|
|||
|
|
|||
|
****************************************************************************/
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Globals
|
|||
|
//
|
|||
|
UNICODE_STRING gRegistryPath = {0,0,0}; // yes globals are automatically initialized
|
|||
|
ULONG gTrace = 0; // to 0's, but let's be explicit.
|
|||
|
ULONG gBreak = 0;
|
|||
|
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* DriverEntry */
|
|||
|
/************************************************************************/
|
|||
|
//
|
|||
|
// Routine Description:
|
|||
|
//
|
|||
|
// - Save a copy of RegistryPath in a global gRegistryPath for use
|
|||
|
// throughout the lifetime of the driver load.
|
|||
|
//
|
|||
|
// - Initialize DriverObject function pointer table to point to
|
|||
|
// our entry points.
|
|||
|
//
|
|||
|
// - Initialize Debug globals gTrace and gBreak based on registry
|
|||
|
// settings.
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
//
|
|||
|
// DriverObject - pointer to Dot4Usb.sys driver object
|
|||
|
// RegistryPath - pointer to RegistryPath for the driver, expected
|
|||
|
// to be of the form (ControlSet may vary):
|
|||
|
// \REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\dot4usb
|
|||
|
//
|
|||
|
// Return Value:
|
|||
|
//
|
|||
|
// NTSTATUS
|
|||
|
//
|
|||
|
// Log:
|
|||
|
// 2000-05-03 Code Reviewed - TomGreen, JobyL, DFritz
|
|||
|
//
|
|||
|
/************************************************************************/
|
|||
|
NTSTATUS
|
|||
|
DriverEntry(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PUNICODE_STRING RegistryPath
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS status = STATUS_SUCCESS;
|
|||
|
|
|||
|
//
|
|||
|
// Save a copy of RegistryPath in global gRegistryPath for use
|
|||
|
// over the lifetime of the driver load.
|
|||
|
// - UNICODE_NULL terminate gRegistryPath.Buffer for added flexibility.
|
|||
|
// - gRegistryPath.Buffer should be freed in DriverUnload()
|
|||
|
//
|
|||
|
|
|||
|
{ // new scope for gRegistryPath initialization - begin
|
|||
|
USHORT newMaxLength = (USHORT)(RegistryPath->Length + sizeof(WCHAR));
|
|||
|
PWSTR p = ExAllocatePool( PagedPool, newMaxLength );
|
|||
|
if( p ) {
|
|||
|
gRegistryPath.Length = 0;
|
|||
|
gRegistryPath.MaximumLength = newMaxLength;
|
|||
|
gRegistryPath.Buffer = p;
|
|||
|
RtlCopyUnicodeString( &gRegistryPath, RegistryPath );
|
|||
|
gRegistryPath.Buffer[ gRegistryPath.Length/2 ] = UNICODE_NULL;
|
|||
|
} else {
|
|||
|
TR_FAIL(("DriverEntry - exit - FAIL - no Pool for gRegistryPath.Buffer"));
|
|||
|
status = STATUS_INSUFFICIENT_RESOURCES;
|
|||
|
goto targetExit;
|
|||
|
}
|
|||
|
} // new scope for gRegistryPath initialization - end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Initialize DriverObject function pointer table to point to our entry points.
|
|||
|
//
|
|||
|
// Start by initializing dispatch table to point to our passthrough function and
|
|||
|
// then override the entry points that we actually handle.
|
|||
|
//
|
|||
|
|
|||
|
{// new scope for index variable - begin
|
|||
|
ULONG i;
|
|||
|
for( i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ ) {
|
|||
|
DriverObject->MajorFunction[i] = DispatchPassThrough;
|
|||
|
}
|
|||
|
} // new scope for index variable - end
|
|||
|
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_PNP ] = DispatchPnp;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_POWER ] = DispatchPower;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_CREATE ] = DispatchCreate;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_CLOSE ] = DispatchClose;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_READ ] = DispatchRead;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_WRITE ] = DispatchWrite;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL ] = DispatchDeviceControl;
|
|||
|
DriverObject->MajorFunction[ IRP_MJ_INTERNAL_DEVICE_CONTROL ] = DispatchInternalDeviceControl;
|
|||
|
|
|||
|
DriverObject->DriverExtension->AddDevice = AddDevice;
|
|||
|
DriverObject->DriverUnload = DriverUnload;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Get driver debug settings (gTrace, gBreak) from registry
|
|||
|
//
|
|||
|
// Expected Key Path is of the form (ControlSet may vary):
|
|||
|
//
|
|||
|
// \REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\dot4usb
|
|||
|
//
|
|||
|
RegGetDword( gRegistryPath.Buffer, (PCWSTR)L"gBreak", &gBreak );
|
|||
|
RegGetDword( gRegistryPath.Buffer, (PCWSTR)L"gTrace", &gTrace );
|
|||
|
|
|||
|
TR_LD_UNLD(("DriverEntry - RegistryPath = <%wZ>", RegistryPath));
|
|||
|
TR_LD_UNLD(("DriverEntry - gBreak=%x", gBreak));
|
|||
|
TR_LD_UNLD(("DriverEntry - gTrace=%x", gTrace));
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Check if user requested a breakpoint here. A breakpoint herew is
|
|||
|
// typically used so that we can insert breakpoints on other
|
|||
|
// functions or change debug settings to differ from those that we
|
|||
|
// just read from the registry.
|
|||
|
//
|
|||
|
if( gBreak & BREAK_ON_DRIVER_ENTRY ) {
|
|||
|
DbgPrint( "D4U: Breakpoint requested via registry setting - (gBreak & BREAK_ON_DRIVER_ENTRY)\n" );
|
|||
|
DbgBreakPoint();
|
|||
|
}
|
|||
|
|
|||
|
targetExit:
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* DriverUnload */
|
|||
|
/************************************************************************/
|
|||
|
//
|
|||
|
// Routine Description:
|
|||
|
//
|
|||
|
// - Free any copy of RegistryPath that might have been saved in
|
|||
|
// global gRegistryPath during DriverEntry().
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
//
|
|||
|
// DriverObject - pointer to Dot4Usb.sys driver object
|
|||
|
//
|
|||
|
// Return Value:
|
|||
|
//
|
|||
|
// NONE
|
|||
|
//
|
|||
|
// Log:
|
|||
|
// 2000-05-03 Code Reviewed - TomGreen, JobyL, DFritz
|
|||
|
//
|
|||
|
/************************************************************************/
|
|||
|
VOID
|
|||
|
DriverUnload(
|
|||
|
IN PDRIVER_OBJECT DriverObject
|
|||
|
)
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER( DriverObject );
|
|||
|
TR_LD_UNLD(("DriverUnload"));
|
|||
|
if( gRegistryPath.Buffer ) {
|
|||
|
RtlFreeUnicodeString( &gRegistryPath );
|
|||
|
}
|
|||
|
}
|