📄 ntdrivercode.txt
字号:
附:杭州照排机核心态驱动
#include "stdlib.h"
#include "HZ_PCI.h"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath )
{
NTSTATUS NTStatus ;
PCI_COMMON_CONFIG PciCfgBuffer ;
PCI_SLOT_NUMBER PciSlotNum ;
ULONG SlotNum ,PortResourceCount,MemoryResourceCount;
ULONG i,BusNumber, Length, Result,NumberOfResources, sizeOfResourceList;
// CM_RESOURCE_LIST ResourceList;
PCM_RESOURCE_LIST pResourceList;
PDEVICE_OBJECT pDeviceObject;
PDEVICE_EXTENSION pDevEx ;
UNICODE_STRING Win32DeviceName;
BOOLEAN bIsCreatedDevice = FALSE ;
ULONG MappedVector,ResourceCount = 0 ;
KIRQL irql = 9;
KAFFINITY Affinity;
UNICODE_STRING EventName ;
ULONG MemorySize = 0x800000 ;
ULONG DefaultSize = 0x800000 ;
// Try to retrieve memory size
{
static WCHAR SubKeyString[] = L"\\Registry\\MACHINE\\SOFTWARE\\Founder\\PSPNT\\Drivers\\HZ_pci\\Parameter\\Memory";
UNICODE_STRING paramPath;
RTL_QUERY_REGISTRY_TABLE paramTable[2];
paramPath.MaximumLength = sizeof(SubKeyString) ;
paramPath.Buffer = ExAllocatePool(PagedPool, paramPath.MaximumLength);
if (paramPath.Buffer != NULL)
{
RtlMoveMemory(paramPath.Buffer, SubKeyString, sizeof(SubKeyString));
paramPath.Length = paramPath.MaximumLength ;
RtlZeroMemory(¶mTable[0], sizeof(paramTable));
paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
paramTable[0].Name = L"Size";
paramTable[0].EntryContext = &MemorySize;
paramTable[0].DefaultType = REG_DWORD;
paramTable[0].DefaultData = &DefaultSize;
paramTable[0].DefaultLength = sizeof(ULONG);
NTStatus = RtlQueryRegistryValues(
RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,
paramPath.Buffer, ¶mTable[0], NULL, NULL) ;
ExFreePool(paramPath.Buffer) ;
paramPath.Buffer = NULL ;
}
}
// search for pci device
NTStatus = STATUS_NO_SUCH_DEVICE ;
Length = sizeof(PCI_COMMON_CONFIG) ;
for ( BusNumber = 0 ; BusNumber <= 255 ; BusNumber ++ )
{
for ( i = 0 ; i < 256 ; i++ )
{
PciCfgBuffer.DeviceID = 0 ;
PciCfgBuffer.VendorID = 0 ;
// PciSlotNum.u.bits.DeviceNumber = i & 0x1F ;
// PciSlotNum.u.bits.FunctionNumber = i & 0xE0 ;
SlotNum = i ;
Result = HalGetBusData(
PCIConfiguration,
BusNumber,
SlotNum,
&PciCfgBuffer,
Length
);
if ( PciCfgBuffer.DeviceID == HANGZHOU_DEVICE_ID && PciCfgBuffer.VendorID == AMCC_VENDOR_ID )
{
KdPrint( ("Find the PCI device! \n") ) ;
NTStatus = STATUS_SUCCESS ;
break ;
}
}
if ( NT_SUCCESS(NTStatus) )
break ;
}
// if find device,then the pci information stored in PciCfgBuffer,then
// assign slot resource such as PciCfgBuffer.u.type0
//
if ( NT_SUCCESS(NTStatus) )
{
// pResourceList = &ResourceList;
NumberOfResources = 6 ; // for our pci device
sizeOfResourceList = sizeof(CM_RESOURCE_LIST) +
( sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)*
(NumberOfResources - 1) );
pResourceList = (PCM_RESOURCE_LIST) ExAllocatePool(PagedPool, sizeOfResourceList);
if ( pResourceList == NULL )
NTStatus = STATUS_NO_MEMORY ;
NTStatus = HalAssignSlotResources (
RegistryPath,
NULL, /* DriverClassName (optional) */
DriverObject,
NULL, /* DeviceObject (optional) */
PCIBus, /* BusType */
BusNumber, /* get in HalGetBusData */
SlotNum, /* get in HalGetBusData */
&pResourceList /* This is the resource get from the pci device.*/
);
if ( !NT_SUCCESS(NTStatus) )
KdPrint( ("HalAssignSlotResources error! \n") ) ;
else
{
// The NT Operate System may change the address of AMCC base memory
// so get PCI info again.
Result = HalGetBusData(
PCIConfiguration,
BusNumber,
SlotNum,
&PciCfgBuffer,
Length
);
}
if ( !NT_SUCCESS(Result) )
KdPrint( ("HalGetBusData error! \n") ) ;
else
{
// Map Interrupt vector
MappedVector = HalGetInterruptVector( PCIBus,
BusNumber,
PciCfgBuffer.u.type0.InterruptLine,
PciCfgBuffer.u.type0.InterruptLine,
&irql,
&Affinity ) ;
}
if ( !NT_SUCCESS(MappedVector) )
KdPrint( ("HalGetInterruptVector error! \n") ) ;
}
// define HZ_PCI IRP's MJ Function
if ( NT_SUCCESS( NTStatus ) )
{
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLOSE] =
DriverObject->MajorFunction[IRP_MJ_WRITE] =
DriverObject->MajorFunction[IRP_MJ_READ] =
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HZDispatch ;
DriverObject->DriverStartIo = HZStartIo ;
DriverObject->DriverUnload = HZUnload ;
}
// create device for HZ_PCI, zero device extension. then create symbolic link
if ( NT_SUCCESS( NTStatus ) )
{
NTStatus = HZCreateDevice(
NT_DEVICE_NAME,
FILE_HZ_DEVICE_PCI_ADAPTER,
DriverObject,
&pDeviceObject
);
// create device ok,then save the pci information into device extension
if ( NT_SUCCESS(NTStatus) )
{
bIsCreatedDevice = TRUE ;
pDevEx = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension ;
pDevEx->BusNumber = BusNumber ;
pDevEx->DeviceObject = pDeviceObject ;
ResourceCount = pResourceList->List[0].PartialResourceList.Count ;
PortResourceCount = MemoryResourceCount = 0 ;
for ( i= 0; i < pResourceList->List[0].PartialResourceList.Count; i++ )
{
switch(pResourceList->List[0].PartialResourceList.PartialDescriptors[i].Type)
{
case CmResourceTypePort:
pDevEx->PortBase[PortResourceCount] =
pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Port.Start.LowPart ;
pDevEx->PortCount[PortResourceCount] =
pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Port.Length ;
++ PortResourceCount ;
break ;
case CmResourceTypeMemory:
pDevEx->MemoryBase[MemoryResourceCount] =
pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Memory.Start.LowPart ;
pDevEx->MemoryLength[MemoryResourceCount] =
pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Memory.Length ;
++ MemoryResourceCount ;
break ;
case CmResourceTypeInterrupt:
pDevEx->InterruptLevel = pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Interrupt.Level ;
pDevEx->InterruptVector= pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Interrupt.Vector;
pDevEx->Affinity = pResourceList->List[0].PartialResourceList.PartialDescriptors[i].u.Interrupt.Affinity ;
break ;
default:
break ;
}
}
pDevEx->PortResourceCount = PortResourceCount ;
pDevEx->MemoryResourceCount = MemoryResourceCount ;
pDevEx->PCIINFO.VendorID = PciCfgBuffer.VendorID ;
pDevEx->PCIINFO.DeviceID = PciCfgBuffer.DeviceID ;
pDevEx->PCIINFO.Command = PciCfgBuffer.Command ;
pDevEx->PCIINFO.Status = PciCfgBuffer.Status ;
pDevEx->PCIINFO.RevisionID = PciCfgBuffer.RevisionID ;
pDevEx->PCIINFO.ProgIf = PciCfgBuffer.ProgIf ;
pDevEx->PCIINFO.SubClass = PciCfgBuffer.SubClass ;
pDevEx->PCIINFO.BaseClass = PciCfgBuffer.BaseClass ;
pDevEx->PCIINFO.CacheLineSize= PciCfgBuffer.CacheLineSize ;
pDevEx->PCIINFO.LatencyTimer = PciCfgBuffer.LatencyTimer ;
pDevEx->PCIINFO.HeaderType = PciCfgBuffer.HeaderType ;
pDevEx->PCIINFO.BIST = PciCfgBuffer.BIST ;
for ( i = 0 ; i < 6; i ++ )
{
pDevEx->PCIINFO.u.type0.BaseAddresses[i] = PciCfgBuffer.u.type0.BaseAddresses[i] ;
}
pDevEx->PCIINFO.u.type0.Reserved2[0] = PciCfgBuffer.u.type0.Reserved2[0] ;
pDevEx->PCIINFO.u.type0.Reserved2[1] = PciCfgBuffer.u.type0.Reserved2[1] ;
pDevEx->PCIINFO.u.type0.ROMBaseAddress = PciCfgBuffer.u.type0.ROMBaseAddress ;
pDevEx->PCIINFO.u.type0.InterruptLine = PciCfgBuffer.u.type0.InterruptLine ;
pDevEx->PCIINFO.u.type0.InterruptPin = PciCfgBuffer.u.type0.InterruptPin ;
pDevEx->PCIINFO.u.type0.MinimumGrant = PciCfgBuffer.u.type0.MinimumGrant ;
pDevEx->PCIINFO.u.type0.MaximumLatency = PciCfgBuffer.u.type0.MaximumLatency ;
}
}
// register DPC routine
if ( NT_SUCCESS( NTStatus ) )
IoInitializeDpcRequest(pDeviceObject, HZDpcRoutine);
// connect the device driver to the IRQ
if ( NT_SUCCESS( NTStatus ) )
{
pDevEx->InterruptObject = NULL ;
NTStatus = IoConnectInterrupt(
&(pDevEx->InterruptObject),
HZInterruptServiceRoutine,
pDevEx->DeviceObject,
NULL, // spin lock
MappedVector, // get from HalGetInterruptVector
irql, // get from HalGetInterruptVector
irql, // get from HalGetInterruptVector
LevelSensitive, // Interrupt Mode
FALSE, // whether share Vector
Affinity, // get from HalGetInterruptVector
FALSE ); // To x86-based platforms,it must be flase
}
if ( NT_SUCCESS(NTStatus) )
{
pDevEx->EventHandle = NULL ;
pDevEx->StopHandle = NULL ;
RtlInitUnicodeString (&EventName, L"\\BaseNamedObjects\\HZSysEventSynchronizedWithUserMode") ;
pDevEx->SramEvent = IoCreateSynchronizationEvent( &EventName, &pDevEx->EventHandle ) ;
if ( pDevEx->SramEvent == NULL )
{
KdPrint( ("Create Event Error!\n") ) ;
NTStatus = STATUS_NO_EVENT_PAIR ;
}
else
{
RtlInitUnicodeString (&EventName, L"\\BaseNamedObjects\\HZKernelStopEvent") ;
pDevEx->StopEvent = IoCreateSynchronizationEvent( &EventName, &pDevEx->StopHandle ) ;
if ( pDevEx->StopEvent == NULL )
{
KdPrint( ("Create Event Error!\n") ) ;
NTStatus = STATUS_NO_EVENT_PAIR ;
}
}
}
//free ResourceList
if ( pResourceList != NULL)
{
ExFreePool(pResourceList);
pResourceList = NULL;
}
// determine which transfer mode would use?
if ( NT_SUCCESS(NTStatus) )
pDeviceObject->Flags |= DO_DIRECT_IO ;
// memory pci port & pci memory ?
//
if ( NT_SUCCESS(NTStatus) )
NTStatus = HZMapPortAndMemory(pDevEx) ;
if ( NT_SUCCESS(NTStatus) )
{
pDevEx->BUFFER_NODE_NUMBER = MemorySize>>19 ;
NTStatus = DriverAllocateBuffer(pDevEx) ;
}
if ( !NT_SUCCESS(NTStatus) && bIsCreatedDevice )
{
if ( pDevEx->InterruptObject != NULL )
{
IoDisconnectInterrupt(pDevEx->InterruptObject);
pDevEx->InterruptObject = NULL ;
}
HZUnMapPortAndMemory(pDevEx) ;
RtlInitUnicodeString(&Win32DeviceName, DOS_DEVICE_NAME);
IoDeleteSymbolicLink(&Win32DeviceName);
IoDeleteDevice(pDevEx->DeviceObject);
if ( pDevEx->StopHandle != NULL )
ZwClose ( pDevEx->StopHandle ) ;
if ( pDevEx->EventHandle != NULL )
ZwClose( pDevEx->EventHandle ) ;
}
return NTStatus ;
}
NTSTATUS HZCreateDevice(IN PWSTR PrototypeName,
IN DEVICE_TYPE DeviceType,
IN PDRIVER_OBJECT DriverObject,
OUT PDEVICE_OBJECT *ppDevObj)
{
NTSTATUS Status ;
UNICODE_STRING NtDeviceName ;
UNICODE_STRING Win32DeviceName ;
RtlInitUnicodeString(&NtDeviceName,PrototypeName);
Status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&NtDeviceName,
DeviceType,
0,
FALSE,
ppDevObj);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -