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;
|
||
}
|