📄 ntdrivercode.txt
字号:
((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 + -