⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntdrivercode.txt

📁 一个内核驱动的源代码,做内核开发的不错的参考程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
附:杭州照排机核心态驱动

#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(&paramTable[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, &paramTable[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 + -