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 );
|
||
}
|
||
}
|