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

📄 ntdrivercode.txt

📁 一个内核驱动的源代码,做内核开发的不错的参考程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
            ((PBUFFER_NODE)pDevEx->lpReadNode)->NodeFlag = NODE_EMPTY ;
            (PBUFFER_NODE)pDevEx->lpReadNode = ((PBUFFER_NODE)pDevEx->lpReadNode)->lpNextNode ;
        }
    }

    // 清中断
    ClearInterrupt( pDevEx ) ;

    // 如果核心态缓冲区有空缓冲节点,置事件通知用户态送数据到核心态.
    if ( bIsSendData )
    {
        IoRequestDpc(DeviceObject,
            DeviceObject->CurrentIrp,
            NULL
            );
    }

#ifdef TEST_SPEED
    KeQuerySystemTime(&Times2);
	pDevEx->ISRTestSpeed.LowPart = pDevEx->ISRTestSpeed.LowPart +
		Times2.LowPart - Times1.LowPart;
	pDevEx->ISRTestSpeed.HighPart = pDevEx->ISRTestSpeed.HighPart +
		Times2.HighPart - Times1.HighPart;
#endif
    return TRUE ;
}

NTSTATUS GetHZSramSize(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PULONG pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(ULONG) ;
    pOutBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer ;

    if ( pDevEx->PCIINFO.RevisionID < 0x20 )
        *(PULONG)pOutBuffer = 0x80000 ;    // 512 K
    else
        *(PULONG)pOutBuffer = 0x80000 ;    // 将来改
	Status = STATUS_SUCCESS ;

    return Status ;
}

NTSTATUS GetHZRegisterStatus(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PULONG pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(ULONG)*6 ;
    pOutBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer ;

	if ( pDevEx->PortWasMapped )
	{
        *(PULONG)pOutBuffer = READ_REGISTER_ULONG((PULONG)pDevEx->HZBackendIoBaseAddress+BSR0_INDEX) ;
        *(PULONG)(pOutBuffer+1) = READ_REGISTER_ULONG((PULONG)pDevEx->HZFrontendIoBaseAddress+FSR_INDEX) ;
        *(PULONG)(pOutBuffer+2) = READ_REGISTER_ULONG((PULONG)pDevEx->AmccPortBase+AMCC_INTCSR_INDEX) ;
		*(PULONG)(pOutBuffer+3) = READ_REGISTER_ULONG((PULONG)pDevEx->AmccPortBase+AMCC_MBEF_INDEX) ;
        *(PULONG)(pOutBuffer+4) = 0 ;
		*(PULONG)(pOutBuffer+5) = 0 ;
	}
    else
	{
        *(PULONG)pOutBuffer = READ_PORT_ULONG((PULONG)pDevEx->HZBackendIoBaseAddress+BSR0_INDEX) ;
        *(PULONG)(pOutBuffer+1) = READ_PORT_ULONG((PULONG)pDevEx->HZFrontendIoBaseAddress+FSR_INDEX) ;
        *(PULONG)(pOutBuffer+2) = READ_PORT_ULONG((PULONG)pDevEx->AmccPortBase+AMCC_INTCSR_INDEX) ;
		*(PULONG)(pOutBuffer+3) = READ_PORT_ULONG((PULONG)pDevEx->AmccPortBase+AMCC_MBEF_INDEX) ;
        *(PULONG)(pOutBuffer+4) = 0 ;
		*(PULONG)(pOutBuffer+5) = 0 ;
	}

	Status = STATUS_SUCCESS ;

    return Status ;
}

NTSTATUS GetHZCardStatus(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PULONG pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(ULONG)*6 ;
    pOutBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer ;

	*(PULONG)pOutBuffer = pDevEx->PCIINFO.VendorID ;
	*(PULONG)(pOutBuffer+1) = pDevEx->PCIINFO.DeviceID ;
	*(PULONG)(pOutBuffer+2) = pDevEx->PCIINFO.u.type0.BaseAddresses[AMCC_IO_INDEX] ;//AmccPortBase ;
	*(PULONG)(pOutBuffer+3) = pDevEx->PCIINFO.u.type0.BaseAddresses[FRONTEND_MEMORY_INDEX] ;//HZMemoryBase ;
	*(PULONG)(pOutBuffer+4) = pDevEx->PCIINFO.u.type0.BaseAddresses[FRONTEND_IO_INDEX] ;//HZFrontendIoBaseAddress ;
	*(PULONG)(pOutBuffer+5) = pDevEx->PCIINFO.u.type0.BaseAddresses[BACKEND_IO_INDEX] ;//HZBackendIoBaseAddress ;

	Status = STATUS_SUCCESS ;

    return Status ;
}

NTSTATUS GetHZSramCounts(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PULONG pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(ULONG) ;
    pOutBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer ;

	*(PULONG)pOutBuffer = pDevEx->dwSramNumCounter ;

	Status = STATUS_SUCCESS ;

    return Status ;
}

NTSTATUS GetHZErrorInformation(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PULONG pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(ULONG) ;
    pOutBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer ;

	*(PULONG)pOutBuffer = pDevEx->dwKernelError ;

	Status = STATUS_SUCCESS ;

    return Status ;
}

// used only for delay certain time
NTSTATUS HZTestIack(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS Status ;
    PULONG  pIOBuffer = (PULONG) pIrp->AssociatedIrp.SystemBuffer ;
    ULONG   i = 0 ;
    
    Status = STATUS_UNSUCCESSFUL ;
    for ( i = 0 ; i < (*pIOBuffer) ; i++ )
    {
        if ( IsBufferEmpty(pDevEx) )
            Status = STATUS_SUCCESS ;
    }

    return Status ;
}

NTSTATUS HZISRSpeedTest(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PLARGE_INTEGER pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(LARGE_INTEGER) ;
    pOutBuffer = (PLARGE_INTEGER)pIrp->AssociatedIrp.SystemBuffer ;
	
	pOutBuffer->u = pDevEx->ISRTestSpeed.u ;
	Status = STATUS_SUCCESS ;

    return Status ;
}

NTSTATUS HZDataSpeedTest(IN PIRP pIrp,IN PDEVICE_EXTENSION pDevEx)
{
    NTSTATUS   Status;
    PLARGE_INTEGER pOutBuffer ;

    pIrp->IoStatus.Information = sizeof(LARGE_INTEGER) ;
    pOutBuffer = (PLARGE_INTEGER)pIrp->AssociatedIrp.SystemBuffer ;
	
	pOutBuffer->u = pDevEx->DataTestSpeed.u ;
	Status = STATUS_SUCCESS ;

    return Status ;
}

VOID HZUnload(IN PDRIVER_OBJECT DriverObject)
{
    PDEVICE_EXTENSION  pDevEx;
    UNICODE_STRING     Win32DeviceName;
    PBUFFER_NODE       lpTmp = NULL;
    ULONG              i = 0 ;
    BOOLEAN			   GotResources; 
    PCM_RESOURCE_LIST  pResourceList;
    ULONG              NumberOfResources, sizeOfResourceList;
    
    // Find our global data
    pDevEx = (PDEVICE_EXTENSION)DriverObject->DeviceObject->DeviceExtension;

    if ( pDevEx->EventHandle != NULL )
        ZwClose( pDevEx->EventHandle ) ;

    if ( pDevEx->StopHandle != NULL )
        ZwClose( pDevEx->StopHandle ) ;

    IoDisconnectInterrupt(pDevEx->InterruptObject);
	
    // We don't need our resourced anymore (ports and interrupt) 
/*	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);
	IoReportResourceUsage(NULL,DriverObject,pResourceList,sizeof(ULONG),NULL,NULL,0,FALSE,&GotResources); 
	if ( pResourceList != NULL)
	{
		ExFreePool(pResourceList);
		pResourceList = NULL;
	}
*/
	if ( pDevEx->lpBuffer != NULL )
	{
		ExFreePool(pDevEx->lpBuffer) ;
		pDevEx->lpBuffer = NULL ;
	}

	if ( pDevEx->lpHeadNode != NULL )
	{
		ExFreePool(pDevEx->lpHeadNode) ;
		pDevEx->lpHeadNode = NULL ;
	}

    HZUnMapPortAndMemory(pDevEx) ;
    
    RtlInitUnicodeString(&Win32DeviceName, DOS_DEVICE_NAME);
    
    IoDeleteSymbolicLink(&Win32DeviceName);
    
    IoDeleteDevice(pDevEx->DeviceObject);

    return ;	   
}

NTSTATUS
HZDispatch(IN PDEVICE_OBJECT pDO, IN PIRP pIrp)
{
    PDEVICE_EXTENSION   pDevEx = (PDEVICE_EXTENSION)pDO->DeviceExtension ;
    PIO_STACK_LOCATION  pIrpStack ;
    ULONG               OutBufferSize,i,j;
    NTSTATUS            Status;
    
    //Initialize the irp info field.
    //    This is used to return the number of bytes transfered.
    pIrp->IoStatus.Information = 0;                      // default: no return value
    
    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);      // Get IrpLocation
    
    //Set default return status
    Status = STATUS_NOT_IMPLEMENTED;
    
    // Dispatch based on major fcn code.
    switch (pIrpStack->MajorFunction)
    {
    case IRP_MJ_CREATE:
    case IRP_MJ_CLOSE:
    case IRP_MJ_READ:
        Status = STATUS_SUCCESS;
        break;
    case IRP_MJ_WRITE:
        IoMarkIrpPending(pIrp) ;
        IoStartPacket(pDO,pIrp,NULL,NULL) ;
        return STATUS_PENDING ;
    case IRP_MJ_DEVICE_CONTROL:
        {
            // Dispatch on IOCTL
            // 针对中断,可能只需更改IOCTL_PSPNT_SET_LAST_BLOCK_LENGTH,just try it!
            switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
            {   
            case IOCTL_PSPNT_GET_REGISTER_STATUS :
                Status = GetHZRegisterStatus(pIrp,pDevEx) ;
                break ;
            case IOCTL_PSPNT_GET_CARD_STATUS :
                Status = GetHZCardStatus(pIrp,pDevEx) ;
                break ;
            case IOCTL_PSPNT_GET_SRAM_COUNTS :
                Status = GetHZSramCounts(pIrp,pDevEx) ;
                break ;
            case IOCTL_PSPNT_GET_SRAM_SIZE :
                Status = GetHZSramSize(pIrp,pDevEx) ;
                break ;
            case IOCTL_PSPNT_GET_ERROR_INFORMATION :
                Status = GetHZErrorInformation(pIrp,pDevEx) ;
                break ;
            case IOCTL_PSPNT_INITIALIZE_ADAPTER :
                Status = HZInitAdapter( pIrp,pDevEx ) ;
                break ;
            case IOCTL_PSPNT_STARTENGINE :
                Status = HZStartEngine( pDevEx ) ;
                break ;
            case IOCTL_PSPNT_STOPENGINE :
                Status = HZStopEngine( pIrp, pDevEx ) ;
                break ;
            case IOCTL_PSPNT_WAITIACK_TEST :
                Status = HZTestIack( pIrp, pDevEx ) ;
                break ;
            case IOCTL_PSPNT_ISRSPEED_TEST :
                Status = HZISRSpeedTest( pIrp, pDevEx ) ;
                break ;
            case IOCTL_PSPNT_DATASPEED_TEST :
                Status = HZDataSpeedTest( pIrp, pDevEx ) ;
                break ;
            case IOCTL_PSPNT_SET_COM :
                {
                    SetCOM(pDevEx) ;
                    Status = STATUS_SUCCESS ;
                }
                break ;
            case IOCTL_PSPNT_RESET :
                {
                    // 复位控制卡
                    ResetOP(pDevEx) ;
                    Status = STATUS_SUCCESS ;
                }
                break ;
            case IOCTL_PSPNT_DEVICE_STATUS :
                {
                    // 检查接口卡状态
                    if ( IsAdapterDeviceOK(pDevEx) )
                        Status = STATUS_SUCCESS ;
                    else
                        Status = STATUS_UNSUCCESSFUL ;
                }
                break ;
            case IOCTL_PSPNT_ALL_BUFFER_EMPTY :
                {
                    // 检查是否所有数据都送完了
                    if ( IsAllBufferEmpty(pDevEx) )
                        Status = STATUS_SUCCESS ;
                    else
                        Status = STATUS_UNSUCCESSFUL ;
                }
                break ;
            }
        }
        break;    // case IRP_MJ_DEVICE_CONTROL:
    default :
        Status = STATUS_SUCCESS ;
        break ;
    }

    //We're done with I/O request.  Record the status of the I/O action.
    pIrp->IoStatus.Status = Status ;
    // Don't boost priority when returning since this took little time.
    IoCompleteRequest(pIrp, IO_NO_INCREMENT ) ;

    return Status ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -