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.
185 lines
4.5 KiB
185 lines
4.5 KiB
/*++
|
|
|
|
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;
|
|
}
|