注意IRP_MJ_WRITE和IRP_MJ_READ处理方式,两者有很大的不同: /************************************************************************ * 函数名称:HelloDDKDispatchRoutine * 功能描述:对读IRP进行处理 * 参数列表: pDevObj:功能设备对象 pIrp:从IO请求包 * 返回 值:返回状态 *************************************************************************/ #pragma PAGEDCODE NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { UNICODE_STRING unicodeString={0}; ANSI_STRING ansiString={0}; ULONG j; NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION Irpsp = IoGetCurrentIrpStackLocation(pIrp); PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; if( pDevExt && pDevExt->pDevice==pDevObj) { // 完成IRP pIrp->IoStatus.Status = status; pIrp->IoStatus.Information = 0; // bytes xfered IoCompleteRequest( pIrp, IO_NO_INCREMENT ); KdPrint(("Leave HelloDDKDispatchRoutine/n")); return status; } if (Irpsp->MajorFunction == IRP_MJ_POWER) { KdPrint(("HelloDDKDispatchRoutine IRP_MJ_POWER /n")); PoStartNextPowerIrp(pIrp); IoSkipCurrentIrpStackLocation(pIrp); return PoCallDriver(realDevObj, pIrp); //调用真实设备 } else if (Irpsp->MajorFunction == IRP_MJ_WRITE) { ULONG uLen = Irpsp->Parameters.Write.Length; //获取写入的长度 PUCHAR pBuf = NULL; if (pIrp->MdlAddress != NULL) pBuf = (PUCHAR)MmGetSystemAddressForMdlSafe (pIrp->MdlAddress , NormalPagePriority); else pBuf = (PUCHAR)pIrp->UserBuffer; if(pBuf == NULL) pBuf = (PUCHAR)pIrp->AssociatedIrp.SystemBuffer; // for (j = 0 ; j < uLen ; j++) // KdPrint(("comcap : SendData : %c/r/n" , pBuf[j])); KdPrint(("IRP_MJ_WRITE : len %d : SendData(S): %s/n",uLen,pBuf)); gdata.uType = IRP_MJ_WRITE; RtlCopyMemory(gdata.message,pBuf,uLen); gdata.len = uLen; KeSetEvent(gEvent,IO_NO_INCREMENT,FALSE); }else if (Irpsp->MajorFunction == IRP_MJ_CREATE) { KdPrint(("HelloDDKDispatchRoutine IRP_MJ_CREATE /n")); }else if (Irpsp->MajorFunction == IRP_MJ_READ) { KdPrint(("HelloDDKDispatchRoutine IRP_MJ_READ /n")); IoSkipCurrentIrpStackLocation(pIrp); IoSetCompletionRoutine(pIrp,fengReadComplete,pDevObj,TRUE,TRUE,TRUE); return IoCallDriver(realDevObj,pIrp); //写文件 // ZwWriteFile(hfile,NULL,NULL,NULL,&iostatus,pBuffer,BUFFER_SIZE,NULL,NULL); }else if (Irpsp->MajorFunction == IRP_MJ_CLOSE) { KdPrint(("HelloDDKDispatchRoutine IRP_MJ_CLOSE /n")); } IoSkipCurrentIrpStackLocation(pIrp); return IoCallDriver(realDevObj,pIrp); } #pragma PAGEDCODE NTSTATUS fengReadComplete(IN PDEVICE_OBJECT DeviectObject, IN PIRP Irp, IN PVOID Context) { PIO_STACK_LOCATION Irpsp; ULONG i; if( Irp->PendingReturned) IoMarkIrpPending( Irp); Irpsp = IoGetCurrentIrpStackLocation(Irp); if(NT_SUCCESS( Irp->IoStatus.Status)) { //读成功才处理 ULONG uLen = Irp->IoStatus.Information; //获取写入的长度 PUCHAR pBuf = NULL; pBuf = (PUCHAR)Irp->AssociatedIrp.SystemBuffer; KdPrint(("IRP_MJ_READ : len %d SendData: %s/n",uLen,pBuf)); gdata.uType = IRP_MJ_READ; RtlCopyMemory(gdata.message,pBuf,uLen); gdata.len = uLen; KeSetEvent(gEvent,IO_NO_INCREMENT,FALSE); } return Irp->IoStatus.Status; } #pragma PAGEDCODE NTSTATUS HelloDDKDeviceIoControl(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { NTSTATUS status = STATUS_SUCCESS; PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; PIO_STACK_LOCATION Irpsp = IoGetCurrentIrpStackLocation(pIrp); KdPrint(("Enter HelloDDKDeviceIoControl/n")); ULONG cbin=Irpsp->Parameters.DeviceIoControl.InputBufferLength; ULONG cbOut=Irpsp->Parameters.DeviceIoControl.OutputBufferLength; ULONG code=Irpsp->Parameters.DeviceIoControl.IoControlCode; if( pDevExt && pDevExt->pDevice==pDevObj) { if( code == IOCTL_SET_EVENT ) { HANDLE hUserEvent= *(HANDLE*) pIrp->AssociatedIrp.SystemBuffer; // PKEVENT pEvent; ObReferenceObjectByHandle(hUserEvent,EVENT_MODIFY_STATE,*ExEventObjectType,KernelMode, (PVOID*)&gEvent,NULL); // gEvent=pEvent; KdPrint(("DeviceIoControl IOCTL_SET_EVENT /n")); pIrp->IoStatus.Information = 0; // bytes xfered // KeSetEvent(pEvent,IO_NO_INCREMENT,FALSE); // ObDereferenceObject(pEvent); }else if( code == IOCTL_GET_SERIAL_MESSAGE ) { REQUEST *pdate=(REQUEST*)pIrp->AssociatedIrp.SystemBuffer; pdate->len = gdata.len; pdate->uType = gdata.uType; // pdate->message = gdata.message; RtlCopyMemory(pdate->message,gdata.message,gdata.len); pIrp->IoStatus.Information=sizeof(REQUEST); } // 完成IRP pIrp->IoStatus.Status = status; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); KdPrint(("Leave HelloDDKDeviceIoControl/n")); return status; } if(Irpsp->MajorFunction == IOCTL_SERIAL_GET_BAUD_RATE) { KdPrint(("DeviceIoControl target is serial /n")); } IoSkipCurrentIrpStackLocation(pIrp); return IoCallDriver(realDevObj,pIrp); } HelloDDKDeviceIoControl 例程是用来同应用层通讯,传递实时数据