|
|
/*++
Copyright (c) 1991-2000 Microsoft Corporation
Module Name:
init.c
Abstract:
DriverEntry initialization code for pnp isa bus driver
Author:
Shie-Lin Tzong (shielint) 3-Jan-1997
Environment:
Kernel mode only.
Revision History:
--*/
#include "busp.h"
#include "pnpisa.h"
BOOLEAN PipIsIsolationDisabled( VOID );
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT,DriverEntry)
#pragma alloc_text(INIT,PipIsIsolationDisabled)
#endif
#if ISOLATE_CARDS
BOOLEAN PipIsIsolationDisabled( )
/*++
Description:
Look in the registry for flag indicating that isolation has been disabled. This is a last resort hook for platforms that can't deal with the RDP and it's boot config.
Return Value:
BOOLEAN indicating whether isolation is disabled or not.
--*/
{ HANDLE serviceHandle, paramHandle; UNICODE_STRING paramString; PKEY_VALUE_FULL_INFORMATION keyInfo; NTSTATUS status; BOOLEAN result = FALSE;
status = PipOpenRegistryKey(&serviceHandle, NULL, &PipRegistryPath, KEY_READ, FALSE); if (!NT_SUCCESS(status)) { return result; }
RtlInitUnicodeString(¶mString, L"Parameters"); status = PipOpenRegistryKey(¶mHandle, serviceHandle, ¶mString, KEY_READ, FALSE); ZwClose(serviceHandle); if (!NT_SUCCESS(status)) { return result; }
status = PipGetRegistryValue(paramHandle, L"IsolationDisabled", &keyInfo); ZwClose(paramHandle); if (NT_SUCCESS(status)) { if((keyInfo->Type == REG_DWORD) && (keyInfo->DataLength >= sizeof(ULONG))) { result = *(PULONG)KEY_VALUE_DATA(keyInfo) != 0; } ExFreePool(keyInfo); }
return result; } #endif
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
/*++
Routine Description:
This routine initializes driver object major function table to handle Pnp IRPs and AddDevice entry point. If detection is allowed, it reports a detected device for the pseudo isapnp bus and performs enumeration.
Arguments:
DriverObject - specifies the driver object for the bus extender.
RegistryPath - supplies a pointer to a unicode string of the service key name in the CurrentControlSet\Services key for the bus extender.
Return Value:
Always return STATUS_UNSUCCESSFUL.
--*/
{
PDRIVER_EXTENSION driverExtension; NTSTATUS status = STATUS_SUCCESS; PDEVICE_OBJECT detectedDeviceObject = NULL;
PipDriverObject = DriverObject; //
// Fill in the driver object
//
DriverObject->DriverUnload = PiUnload; DriverObject->MajorFunction[IRP_MJ_PNP] = PiDispatchPnp; DriverObject->MajorFunction[IRP_MJ_POWER] = PiDispatchPower; //
// Device and system control IRPs can be handled in the same way
// we basically don't touch them
//
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PiDispatchDevCtl; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = PiDispatchDevCtl;
driverExtension = DriverObject->DriverExtension; driverExtension->AddDevice = PiAddDevice;
//
// Store our registry path globally so we can use it later
//
PipRegistryPath.Length = RegistryPath->Length; PipRegistryPath.MaximumLength = RegistryPath->MaximumLength; PipRegistryPath.Buffer = ExAllocatePool(PagedPool, RegistryPath->MaximumLength ); if( PipRegistryPath.Buffer == NULL ){ return STATUS_INSUFFICIENT_RESOURCES; }
RtlCopyMemory( PipRegistryPath.Buffer, RegistryPath->Buffer, RegistryPath->MaximumLength );
//
// Initialize global varaibles
//
KeInitializeEvent (&PipDeviceTreeLock, SynchronizationEvent, TRUE); KeInitializeEvent (&IsaBusNumberLock, SynchronizationEvent, TRUE);
BusNumBM=&BusNumBMHeader; RtlInitializeBitMap (BusNumBM,BusNumberBuffer,256/sizeof (ULONG)); RtlClearAllBits (BusNumBM);
#if ISOLATE_CARDS
PipIsolationDisabled = PipIsIsolationDisabled(); #endif
return status; }
|