Leaked source code of windows server 2003
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.
|
|
/***************************************************************************
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 ); } }
|