144 lines
4.5 KiB
C
144 lines
4.5 KiB
C
|
//+-------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// Microsoft Windows
|
|||
|
//
|
|||
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|||
|
//
|
|||
|
// File: initunld.c
|
|||
|
//
|
|||
|
//--------------------------------------------------------------------------
|
|||
|
|
|||
|
//
|
|||
|
// This file contains functions associated with driver initialization and unload.
|
|||
|
//
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DriverEntry(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PUNICODE_STRING pRegistryPath
|
|||
|
)
|
|||
|
/*++dvdf2
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine initializes the ParClass driver. This is the first driver
|
|||
|
routine called after the driver is loaded.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DriverObject - points to the ParClass (parallel.sys) driver object
|
|||
|
|
|||
|
pRegistryPath - points to the registry path for this driver
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
STATUS_SUCCESS
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
#if DBG
|
|||
|
ParInitDebugLevel(pRegistryPath); // initialize driver debug settings from registry
|
|||
|
//ParDebugLevel = -1;
|
|||
|
#endif
|
|||
|
|
|||
|
ParBreak(PAR_BREAK_ON_DRIVER_ENTRY, ("DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING)\n") );
|
|||
|
|
|||
|
//
|
|||
|
// initialize driver globals
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Default timeout when trying to acquire ParPort
|
|||
|
//
|
|||
|
AcquirePortTimeout.QuadPart = -((LONGLONG) 10*1000*500); // 500 ms (timeouts in 100ns units)
|
|||
|
|
|||
|
//
|
|||
|
// Save Registry path that we were given for use later for WMI.
|
|||
|
//
|
|||
|
RegistryPath.Buffer = ExAllocatePool( PagedPool, pRegistryPath->MaximumLength + sizeof(UNICODE_NULL) );
|
|||
|
if( NULL == RegistryPath.Buffer ) {
|
|||
|
ParDump2(PARERRORS, ("initunld::DriverEntry - unable to alloc space to hold RegistryPath\n") );
|
|||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
|||
|
} else {
|
|||
|
RtlZeroMemory( RegistryPath.Buffer, pRegistryPath->MaximumLength + sizeof(UNICODE_NULL) );
|
|||
|
RegistryPath.Length = pRegistryPath->Length;
|
|||
|
RegistryPath.MaximumLength = pRegistryPath->MaximumLength;
|
|||
|
RtlMoveMemory( RegistryPath.Buffer, pRegistryPath->Buffer, pRegistryPath->Length );
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Check for settings under HKLM\SYSTEM\CurrentControlSet\Services\Parallel\Parameters
|
|||
|
//
|
|||
|
ParGetDriverParameterDword( &RegistryPath, (PWSTR)L"SppNoRaiseIrql", &SppNoRaiseIrql );
|
|||
|
ParGetDriverParameterDword( &RegistryPath, (PWSTR)L"DefaultModes", &DefaultModes );
|
|||
|
ParGetDriverParameterDword( &RegistryPath, (PWSTR)L"DumpDevExtTable", &DumpDevExtTable );
|
|||
|
|
|||
|
//
|
|||
|
// Dump DEVICE_EXTENSION offsets if requested
|
|||
|
//
|
|||
|
if( DumpDevExtTable ) {
|
|||
|
ParDumpDevExtTable();
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// initialize DriverObject pointers to our dispatch routines
|
|||
|
//
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = ParCreateOpen;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ParClose;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ParCleanup;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_READ] = ParReadWrite;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_WRITE] = ParReadWrite;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ParDeviceControl;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ParInternalDeviceControl;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = ParQueryInformationFile;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = ParSetInformationFile;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_PNP] = ParParallelPnp;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_POWER] = ParPower;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = ParWmiPdoSystemControlDispatch;
|
|||
|
DriverObject->DriverExtension->AddDevice = ParPnpAddDevice;
|
|||
|
DriverObject->DriverUnload = ParUnload;
|
|||
|
|
|||
|
return STATUS_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
ParUnload(
|
|||
|
IN PDRIVER_OBJECT DriverObject
|
|||
|
)
|
|||
|
|
|||
|
/*++dvdf2
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine is called to allow the ParClass driver to do any required
|
|||
|
cleanup prior to the driver being unloaded. This is the last driver
|
|||
|
routine called before the driver is loaded.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DriverObject - points to the ParClass driver object
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
No ParClass device objects remain at the time that this routine is called.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER( DriverObject );
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
RtlFreeUnicodeString( &RegistryPath ); // free buffer we allocated in DriverEntry
|
|||
|
|
|||
|
ParDump2(PARUNLOAD, ("ParUnload() - Cleanup prior to unload of ParClass driver (parallel.sys)\n") );
|
|||
|
ParBreak(PAR_BREAK_ON_UNLOAD, ("ParUnload(PDRIVER_OBJECT)\n") );
|
|||
|
}
|