195 lines
4.6 KiB
C
195 lines
4.6 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
|
|||
|
#if defined(_X86_) && ISOLATE_CARDS
|
|||
|
if (IsNEC_98) {
|
|||
|
ADDRESS_PORT=ADDRESS_PORT_NEC;
|
|||
|
COMMAND_PORT=COMMAND_PORT_NEC;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
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;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = PiDispatchCreate;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = PiDispatchClose;
|
|||
|
|
|||
|
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;
|
|||
|
}
|