?? tmman.c
字號:
{
RtlInitUnicodeString (&UnicodeValueName, ((PKEY_VALUE_BASIC_INFORMATION)BasicInformation)->Name );
RtlUnicodeStringToInteger( &UnicodeValueName, 16, ValuePtr);
return TRUE;
}
else
{
return FALSE;
}
}
BOOLEAN RegistryReadDWORD (
HANDLE RegistryHandle,
PWCHAR ValueName,
PULONG ValuePtr )
{
ULONG BytesXfered;
NTSTATUS Status;
UNICODE_STRING UnicodeValueName;
PUCHAR PartialInformation[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
RtlInitUnicodeString (&UnicodeValueName, ValueName );
Status = ZwQueryValueKey(
RegistryHandle,
&UnicodeValueName,
KeyValuePartialInformation,
(PVOID)PartialInformation,
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG),
&BytesXfered );
if ( NT_SUCCESS ( Status ) &&
((PKEY_VALUE_PARTIAL_INFORMATION)PartialInformation)->DataLength == sizeof(ULONG) )
{
*ValuePtr = *((PULONG)&((PKEY_VALUE_PARTIAL_INFORMATION)PartialInformation)->Data[0]);
return TRUE;
}
else
{
return FALSE;
}
}
BOOLEAN
InitBridge (
halParameters* Config )
{
ULONG Data;
Data = 0x06;
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x44, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
Data = 0x00001000;
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x50, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR Mem BAR:FAIL\n"));
return FALSE;
}
Data = 0xFFFFFFFF;
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x54, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR IO BAR:FAIL\n"));
return FALSE;
}
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->SystemBaseAddress,
(ULONG)0x58, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR IO BAR:FAIL\n"));
return FALSE;
}
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->SDRAMBaseAddress,
(ULONG)0x98, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR IO BAR:FAIL\n"));
return FALSE;
}
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->MMIOBaseAddress,
(ULONG)0x9C, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR IO BAR:FAIL\n"));
return FALSE;
}
Data = 0x00000000;
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0xA4, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR IO BAR:FAIL\n"));
return FALSE;
}
Data = 0xFFFF0000;
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x90, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitBridge:HalSetBusDataByOffset:Secondary CSR IO BAR:FAIL\n"));
return FALSE;
}
return TRUE /* TMOK */;
}
/*
This function will configure the TMX000 device behind the DEC Bridge
and also extract the relevant information about the TMX000 device
into the HalParametrs structure.
*/
BOOLEAN
InitTriMedia (
halParameters* Config )
{
ULONG ShiftIndex;
ULONG TriMediaAccessAddress;
ULONG Data;
/* search secondary for Trimedia */
for ( ShiftIndex = 0 ; ShiftIndex < 16 ; ShiftIndex++ )
{
TriMediaAccessAddress = (0x00010000 << ShiftIndex);
Data = TriMediaAccessAddress;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
/* Config Address Register Type 0 Address */
if ( HalGetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->TMDeviceVendorID,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
DPF(0,("InitTriMedia:TriMediaAccessAddress[0x%x]:DeviceVendorID[0x%x]\n",
TriMediaAccessAddress, Config->TMDeviceVendorID ));
if ( ( Config->TMDeviceVendorID == ( ( constTMMANTM1000DeviceID << 16 ) | constTMMANTM1000VendorID ) ) ||
( Config->TMDeviceVendorID == ( ( constTMMANTM2000DeviceID << 16 ) | constTMMANTM2000VendorID ) ) ||
( Config->TMDeviceVendorID == ( ( constTMMANTM1300DeviceID << 16 ) | constTMMANTM1300VendorID ) ) )
{
break;
}
}
if ( ( Config->TMDeviceVendorID != ( ( constTMMANTM1000DeviceID << 16 ) | constTMMANTM1000VendorID ) ) &&
( Config->TMDeviceVendorID != ( ( constTMMANTM2000DeviceID << 16 ) | constTMMANTM2000VendorID ) ) &&
( Config->TMDeviceVendorID != ( ( constTMMANTM1300DeviceID << 16 ) | constTMMANTM1300VendorID ) ) )
{
return FALSE;
}
///////////////////////////////////////////////////////////////////////
Data = TriMediaAccessAddress | 0x00000008;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
/* Config Address Register Type 0 Address */
if ( HalGetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->TMClassRevisionID,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
///////////////////////////////////////////////////////////////////////
// read the subsystem and subsystem vendor ID.
Data = TriMediaAccessAddress | 0x0000002C;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
/* Config Address Register Type 0 Address */
if ( HalGetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->TMSubsystemID,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
///////////////////////////////////////////////////////////////////////
Data = TriMediaAccessAddress | 0x0000000C;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
Data = 0x00000000;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
///////////////////////////////////////////////////////////////////////
Data = TriMediaAccessAddress | 0x00000010;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
Data = 0x00000000;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->SDRAMBaseAddress,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
///////////////////////////////////////////////////////////////////////
Data = TriMediaAccessAddress | 0x00000014;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
Data = 0x00000000;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->MMIOBaseAddress,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
///////////////////////////////////////////////////////////////////////
Data = TriMediaAccessAddress | 0x0000003C;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
Data = 0x00000000;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Config->InterruptVector,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
///////////////////////////////////////////////////////////////////////
Data = TriMediaAccessAddress | 0x00000004;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x80, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalSetBusDataByOffset:Secondary Command Status Write:FAIL\n"));
return FALSE;
}
Data = 0x00000006;
/* Config Address Register Type 0 Address */
if ( HalSetBusDataByOffset (
PCIConfiguration,
(ULONG)Config->BusNumber,
Config->SlotNumber.u.AsULONG,
&Data,
(ULONG)0x84, // register offset in config space
sizeof (ULONG) ) != sizeof ( ULONG ) )
{
DPF(0,("InitTriMedia:HalGetBusDataByOffset:Secondary Vendor Device ID:FAIL\n"));
return FALSE;
}
return TRUE; /* TMOK */;
}
///////////////////////////////////////////////////////////////////////
// NEW API ADDED FOR HOOKING ISR and DPC from NT Kernel Mode
///////////////////////////////////////////////////////////////////////
BOOLEAN
TMMANHookISR(
ULONG DeviceNumber,
ULONG Function,
PVOID Context,
ULONG Flags )
{
TMManDeviceObject* TMManDevice;
if ( ( TMManDevice = TMManGlobal->DeviceList[DeviceNumber] ) == NULL )
return FALSE;
return halHookISR (
TMManDevice->HalHandle,
Function,
Context,
Flags );
}
BOOLEAN
TMMANUnhookISR(
ULONG DeviceNumber )
{
TMManDeviceObject* TMManDevice;
if ( ( TMManDevice = TMManGlobal->DeviceList[DeviceNumber] ) == NULL )
return FALSE;
return halUnhookISR (
TMManDevice->HalHandle );
}
BOOLEAN
TMMANHookDPC(
ULONG DeviceNumber,
ULONG Function,
PVOID Context,
ULONG Flags )
{
TMManDeviceObject* TMManDevice;
if ( ( TMManDevice = TMManGlobal->DeviceList[DeviceNumber] ) == NULL )
return FALSE;
return halHookDPC (
TMManDevice->HalHandle,
Function,
Context,
Flags );
}
BOOLEAN
TMMANUnhookDPC(
ULONG DeviceNumber )
{
TMManDeviceObject* TMManDevice;
if ( ( TMManDevice = TMManGlobal->DeviceList[DeviceNumber] ) == NULL )
return FALSE;
return halUnhookDPC (
TMManDevice->HalHandle );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -