Source code of Windows XP (NT5)
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.0 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 );
}
}