You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
7.2 KiB
209 lines
7.2 KiB
/***************************************************************************
|
|
|
|
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 );
|
|
}
|
|
}
|