本文整理汇总了C++中IoCompleteRequest函数的典型用法代码示例。如果您正苦于以下问题:C++ IoCompleteRequest函数的具体用法?C++ IoCompleteRequest怎么用?C++ IoCompleteRequest使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IoCompleteRequest函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: TapDeviceCreate
// IRP_MJ_CREATE
NTSTATUS
TapDeviceCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
/*++
Routine Description:
This routine is called by the I/O system when the device is opened.
No action is performed other than completing the request successfully.
Arguments:
DeviceObject - a pointer to the object that represents the device
that I/O is to be done on.
Irp - a pointer to the I/O Request Packet for this request.
Return Value:
NT status code
--*/
{
NDIS_STATUS status;
PIO_STACK_LOCATION irpSp; // Pointer to current stack location
PTAP_ADAPTER_CONTEXT adapter = NULL;
PFILE_OBJECT originalFileObject;
PAGED_CODE();
DEBUGP(("[TAP] --> TapDeviceCreate\n"));
irpSp = IoGetCurrentIrpStackLocation(Irp);
//
// Invalidate file context
//
irpSp->FileObject->FsContext = NULL;
irpSp->FileObject->FsContext2 = NULL;
//
// Find adapter context for this device.
// -------------------------------------
// Returns with added reference on adapter context.
//
adapter = tapAdapterContextFromDeviceObject(DeviceObject);
// Insure that adapter exists.
ASSERT(adapter);
if (adapter == NULL) {
DEBUGP(("[TAP] release [%d.%d] open request; adapter not found\n", TAP_DRIVER_MAJOR_VERSION,
TAP_DRIVER_MINOR_VERSION));
Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
DEBUGP(("[%s] [TAP] release [%d.%d] open request (TapFileIsOpen=%d)\n",
MINIPORT_INSTANCE_ID(adapter), TAP_DRIVER_MAJOR_VERSION, TAP_DRIVER_MINOR_VERSION,
adapter->TapFileIsOpen));
// Enforce exclusive access
originalFileObject =
InterlockedCompareExchangePointer(&adapter->TapFileObject, irpSp->FileObject, NULL);
if (originalFileObject == NULL) {
irpSp->FileObject->FsContext = adapter; // Quick reference
status = STATUS_SUCCESS;
} else {
status = STATUS_UNSUCCESSFUL;
}
// Release the lock.
// tapAdapterReleaseLock(adapter,FALSE);
if (status == STATUS_SUCCESS) {
// Reset adapter state on successful open.
tapResetAdapterState(adapter);
adapter->TapFileIsOpen = 1; // Legacy...
// NOTE!!! Reference added by tapAdapterContextFromDeviceObject
// will be removed when file is closed.
} else {
DEBUGP(("[%s] TAP is presently unavailable (TapFileIsOpen=%d)\n", MINIPORT_INSTANCE_ID(adapter),
adapter->TapFileIsOpen));
NOTE_ERROR();
// Remove reference added by tapAdapterContextFromDeviceObject.
tapAdapterContextDereference(adapter);
}
//.........这里部分代码省略.........
示例2: Bus_CreateClose
NTSTATUS
Bus_CreateClose (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
Some outside source is trying to create a file against us.
If this is for the FDO (the bus itself) then the caller
is trying to open the proprietary connection to tell us
to enumerate or remove a device.
If this is for the PDO (an object on the bus) then this
is a client that wishes to use the toaster device.
Arguments:
DeviceObject - pointer to a device object.
Irp - pointer to an I/O Request Packet.
Return Value:
NT status code
--*/
{
PIO_STACK_LOCATION irpStack;
NTSTATUS status;
PFDO_DEVICE_DATA fdoData;
PAGED_CODE ();
Bus_KdPrint_Def (BUS_DBG_SS_TRACE, ("Entered. \n"));
fdoData = (PFDO_DEVICE_DATA) DeviceObject->DeviceExtension;
status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Information = 0;
Bus_IncIoCount (fdoData);
//
// If it's not for the FDO. We don't allow create/close on PDO
//
if (fdoData->IsFDO) {
//
// Check to see whether the bus is removed
//
if (fdoData->DevicePnPState == Deleted){
status = STATUS_NO_SUCH_DEVICE;
} else {
irpStack = IoGetCurrentIrpStackLocation (Irp);
switch (irpStack->MajorFunction) {
case IRP_MJ_CREATE:
Bus_KdPrint_Def (BUS_DBG_SS_TRACE, ("Create \n"));
status = STATUS_SUCCESS;
break;
case IRP_MJ_CLOSE:
Bus_KdPrint_Def (BUS_DBG_SS_TRACE, ("Close \n"));
status = STATUS_SUCCESS;
break;
default:
break;
}
}
}
Irp->IoStatus.Status = status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
Bus_DecIoCount (fdoData);
return status;
}
示例3: DriverDispatchHandler
NTSTATUS DriverDispatchHandler (__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
NTSTATUS nsStatus = STATUS_UNSUCCESSFUL;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation (Irp);
PBDKIT_DEVICE_EXTENSION pDevExt = (PBDKIT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
WCHAR szImageName[MAX_PATH - 1] = {L"\0"};
ULONG ulLength = 0;
do
{
if ( IrpSp->MajorFunction != IRP_MJ_SHUTDOWN )
{
if ( !NT_SUCCESS(BDKitIsAuthorizedProcess(PsGetCurrentProcess())) )
{
nsStatus=BDKitGetProcessImageNameByEProcess_s(PsGetCurrentProcess(), szImageName, sizeof(szImageName));
if ( !NT_SUCCESS(nsStatus) )
{
Irp->IoStatus.Status = nsStatus = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
break;
}
#ifndef DBG
nsStatus = VerifyFile(szImageName);
if ( !NT_SUCCESS(nsStatus) )
{
Irp->IoStatus.Status = nsStatus = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
break;
}
#endif
nsStatus = BDKitAddAuthorizedProcess (PsGetCurrentProcess());
BDKit_If_Not_Break(NT_SUCCESS(nsStatus));
}
}
switch(IrpSp->MajorFunction)
{
case IRP_MJ_CREATE:
{
BDbgPrint ("[BDKIT]Open Deivce\r\n");
InterlockedIncrement((volatile LONG*)&pDevExt->DeviceRefence);
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = nsStatus = STATUS_SUCCESS;
}
break;
case IRP_MJ_DEVICE_CONTROL:
{
nsStatus = DriverControlUtilityHandler (DeviceObject, Irp);
}
break;
case IRP_MJ_CLOSE:
{
BDbgPrint ("[BDKIT]Close Device\r\n");
InterlockedDecrement((LONG volatile*)&pDevExt->DeviceRefence);
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = nsStatus = STATUS_SUCCESS;
BDKitRemoveAuthorizedProcess (PsGetCurrentProcess());
}
break;
case IRP_MJ_SHUTDOWN:
{
//BDbgPrint ("[BDKIT]Clear Delete FileList\r\n");
//BDKitClearDeleteFileList ();
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = nsStatus = STATUS_SUCCESS;
}
break;
default:
{
return DriverPassthroughHandler (DeviceObject, Irp);
}
}
} while (FALSE);
if ( nsStatus != STATUS_PENDING )
{
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
return nsStatus;
}
示例4: VfatFileSystemControl
/*
* FUNCTION: File system control
*/
NTSTATUS
VfatFileSystemControl(
PVFAT_IRP_CONTEXT IrpContext)
{
NTSTATUS Status;
DPRINT("VfatFileSystemControl(IrpContext %p)\n", IrpContext);
ASSERT(IrpContext);
ASSERT(IrpContext->Irp);
ASSERT(IrpContext->Stack);
IrpContext->Irp->IoStatus.Information = 0;
switch (IrpContext->MinorFunction)
{
case IRP_MN_KERNEL_CALL:
case IRP_MN_USER_FS_REQUEST:
switch(IrpContext->Stack->Parameters.DeviceIoControl.IoControlCode)
{
case FSCTL_GET_VOLUME_BITMAP:
Status = VfatGetVolumeBitmap(IrpContext);
break;
case FSCTL_GET_RETRIEVAL_POINTERS:
Status = VfatGetRetrievalPointers(IrpContext);
break;
case FSCTL_MOVE_FILE:
Status = VfatMoveFile(IrpContext);
break;
case FSCTL_IS_VOLUME_DIRTY:
Status = VfatIsVolumeDirty(IrpContext);
break;
case FSCTL_MARK_VOLUME_DIRTY:
Status = VfatMarkVolumeDirty(IrpContext);
break;
case FSCTL_LOCK_VOLUME:
Status = VfatLockOrUnlockVolume(IrpContext, TRUE);
break;
case FSCTL_UNLOCK_VOLUME:
Status = VfatLockOrUnlockVolume(IrpContext, FALSE);
break;
case FSCTL_DISMOUNT_VOLUME:
Status = VfatDismountVolume(IrpContext);
break;
default:
Status = STATUS_INVALID_DEVICE_REQUEST;
}
break;
case IRP_MN_MOUNT_VOLUME:
Status = VfatMount(IrpContext);
break;
case IRP_MN_VERIFY_VOLUME:
DPRINT("VFATFS: IRP_MN_VERIFY_VOLUME\n");
Status = VfatVerify(IrpContext);
break;
default:
DPRINT("VFAT FSC: MinorFunction %u\n", IrpContext->MinorFunction);
Status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
IrpContext->Irp->IoStatus.Status = Status;
IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
VfatFreeIrpContext(IrpContext);
return Status;
}
示例5: AskUserWorker
//////////////////////////////////////////////////////////////////////////
//取出pendding的IRP,并完成,用户层异步得到通知
VOID AskUserWorker(PDEVICE_OBJECT DeviceObject, PVOID pContext)
{
PIO_WORKITEM pWorkItem = NULL;
PASKUserWorkItemContext pAskContext =NULL;
PIRP Irp=NULL;
PLIST_ENTRY pListEntry=NULL;
NTSTATUS Status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack;
PVOID ioBuf;
ULONG inBufLength, outBufLength;
PFIREWALL_ASKUSER pFireAskUser=NULL;
KIRQL CIrql,CIrql2;
CIrql=CIrql2=0;
CIrql = KeGetCurrentIrql();
pAskContext = (PASKUserWorkItemContext)pContext;
do
{
if (pAskContext==NULL)
{
break;
}
while(!IsListEmpty(&g_AskUserConnectListHeader))
{
//find a pendding irp 2 ask user decision
pListEntry = ExInterlockedRemoveHeadList(&g_AskUserConnectListHeader, &g_AskUserConnectListLock);
Irp = CONTAINING_RECORD(pListEntry, IRP, Tail.Overlay.ListEntry);
break;
}
if (Irp==NULL)
{
break;
}
irpStack = IoGetCurrentIrpStackLocation(Irp);
ioBuf = Irp->AssociatedIrp.SystemBuffer;
inBufLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outBufLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
pFireAskUser = (PFIREWALL_ASKUSER)ioBuf;
//把DST、SRC IP,PORT带上去,后面再带下来
//let ring3 know what the port is asking for permission
*pFireAskUser = *(PFIREWALL_ASKUSER)pAskContext->pContext;
Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = sizeof(FIREWALL_ASKUSER);
IoCompleteRequest(Irp, IO_NO_INCREMENT);
} while (0);
if (pAskContext)
{
IoFreeWorkItem(pAskContext->pWorkItem);
kfree(pAskContext->pContext);
kfree(pAskContext);
}
if (KeGetCurrentIrql()>CIrql)
{
KeLowerIrql(CIrql);
}
if (KeGetCurrentIrql()<CIrql)
{
KeRaiseIrql(CIrql, &CIrql2);
}
}
示例6: DokanCompleteCreate
VOID
DokanCompleteCreate(
__in PIRP_ENTRY IrpEntry,
__in PEVENT_INFORMATION EventInfo
)
{
PIRP irp;
PIO_STACK_LOCATION irpSp;
NTSTATUS status;
ULONG info;
PDokanCCB ccb;
PDokanFCB fcb;
irp = IrpEntry->Irp;
irpSp = IrpEntry->IrpSp;
DDbgPrint("==> DokanCompleteCreate\n");
ccb = IrpEntry->FileObject->FsContext2;
ASSERT(ccb != NULL);
fcb = ccb->Fcb;
ASSERT(fcb != NULL);
DDbgPrint(" FileName:%wZ\n", &fcb->FileName);
ccb->UserContext = EventInfo->Context;
//DDbgPrint(" set Context %X\n", (ULONG)ccb->UserContext);
status = EventInfo->Status;
info = EventInfo->Operation.Create.Information;
switch (info) {
case FILE_OPENED:
DDbgPrint(" FILE_OPENED\n");
break;
case FILE_CREATED:
DDbgPrint(" FILE_CREATED\n");
break;
case FILE_OVERWRITTEN:
DDbgPrint(" FILE_OVERWRITTEN\n");
break;
case FILE_DOES_NOT_EXIST:
DDbgPrint(" FILE_DOES_NOT_EXIST\n");
break;
case FILE_EXISTS:
DDbgPrint(" FILE_EXISTS\n");
break;
case FILE_SUPERSEDED:
DDbgPrint(" FILE_SUPERSEDED\n");
break;
default:
DDbgPrint(" info = %d\n", info);
break;
}
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&fcb->Resource, TRUE);
if (NT_SUCCESS(status) &&
(irpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE ||
EventInfo->Operation.Create.Flags & DOKAN_FILE_DIRECTORY)) {
if (irpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE) {
DDbgPrint(" FILE_DIRECTORY_FILE %p\n", fcb);
} else {
DDbgPrint(" DOKAN_FILE_DIRECTORY %p\n", fcb);
}
fcb->Flags |= DOKAN_FILE_DIRECTORY;
}
ExReleaseResourceLite(&fcb->Resource);
KeLeaveCriticalRegion();
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&ccb->Resource, TRUE);
if (NT_SUCCESS(status)) {
ccb->Flags |= DOKAN_FILE_OPENED;
}
ExReleaseResourceLite(&ccb->Resource);
KeLeaveCriticalRegion();
if (NT_SUCCESS(status)) {
if (info == FILE_CREATED) {
if (fcb->Flags & DOKAN_FILE_DIRECTORY) {
DokanNotifyReportChange(fcb, FILE_NOTIFY_CHANGE_DIR_NAME, FILE_ACTION_ADDED);
} else {
DokanNotifyReportChange(fcb, FILE_NOTIFY_CHANGE_FILE_NAME, FILE_ACTION_ADDED);
}
}
} else {
DDbgPrint(" IRP_MJ_CREATE failed. Free CCB:%p\n", ccb);
DokanFreeCCB(ccb);
DokanFreeFCB(fcb);
}
irp->IoStatus.Status = status;
irp->IoStatus.Information = info;
IoCompleteRequest(irp, IO_NO_INCREMENT);
DokanPrintNTStatus(status);
DDbgPrint("<== DokanCompleteCreate\n");
//.........这里部分代码省略.........
示例7: OsrRead
///////////////////////////////////////////////////////////////////////////////
//
// OsrRead
//
// This is the read dispatch entry point for the driver, called when the
// I/O Manager has an IRP_MJ_READ request for the driver to process.
//
// INPUTS:
//
// DeviceObject - Address of the DEVICE_OBJECT for our device.
//
// Irp - Address of the IRP representing the IRP_MJ_READ call.
//
// OUTPUTS:
//
// None.
//
// RETURNS:
//
// STATUS_PENDING, since we are putting the IRP on our internal queue.
//
// IRQL:
//
// This routine is called at IRQL_PASSIVE_LEVEL.
//
// NOTES:
//
// Since we set the DO_DIRECT_IO bit in the Device Object, all buffers
// passed to us will have been probed and locked and described by an MDL.
// The I/O manager will provides us the MDL address in Irp->MdlAddress.
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS OsrRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
POSR_DEVICE_EXT devExt = DeviceObject->DeviceExtension;
KIRQL oldIrql;
NTSTATUS code = STATUS_SUCCESS;
BOOLEAN listWasEmpty;
PIO_STACK_LOCATION ioStack;
ULONG temp;
#if DBG
DbgPrint("OsrRead: entered\n");
#endif
//
// See what sort of state we're in
//
if (devExt->State < STATE_ALL_BELOW_FAIL) {
code = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = code;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return code;
}
OsrRequestIncrement(devExt);
//
// Validate the IRP we've received
//
ioStack = IoGetCurrentIrpStackLocation(Irp);
//
// If the length of the requested transfer is either zero or too long,
// we immediately compelte the IRP with an error status.
//
if (ioStack->Parameters.Read.Length == 0 ||
ioStack->Parameters.Read.Length > OSR_PCI_MAX_TXFER) {
Irp->IoStatus.Status = STATUS_INVALID_USER_BUFFER;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_INVALID_USER_BUFFER);
}
//
// Get the Read Queue lock, so we can insert our IRP
//
KeAcquireSpinLock(&devExt->ReadQueueLock, &oldIrql);
//
// Since we'll probably be queuing this request, set a routine
// to be called by the I/O Manager in case he needs to cancel
// this IRP.
//
IoSetCancelRoutine(Irp, OsrCancelFromReadQueue);
//
// Do we need to cancel this IRP, instead of queue it?
//
if (Irp->Cancel) {
//.........这里部分代码省略.........
示例8: tapCompleteIrpAndFreeReceiveNetBufferList
//.........这里部分代码省略.........
{
switch(frameType)
{
case NDIS_PACKET_TYPE_DIRECTED:
Adapter->FramesRxDirected += netBufferCount;
Adapter->BytesRxDirected += byteCount;
break;
case NDIS_PACKET_TYPE_BROADCAST:
Adapter->FramesRxBroadcast += netBufferCount;
Adapter->BytesRxBroadcast += byteCount;
break;
case NDIS_PACKET_TYPE_MULTICAST:
Adapter->FramesRxMulticast += netBufferCount;
Adapter->BytesRxMulticast += byteCount;
break;
default:
ASSERT(FALSE);
break;
}
}
//
// Handle P2P Packet
// -----------------
// Free MDL allocated for P2P Ethernet header.
//
if(TAP_RX_NBL_FLAG_TEST(NetBufferList,TAP_RX_NBL_FLAGS_IS_P2P))
{
PNET_BUFFER netBuffer;
PMDL mdl;
netBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
mdl = NET_BUFFER_FIRST_MDL(netBuffer);
mdl->Next = NULL;
NdisFreeMdl(mdl);
}
//
// Handle Injected Packet
// -----------------------
// Free MDL and data buffer allocated for injected packet.
//
if(TAP_RX_NBL_FLAG_TEST(NetBufferList,TAP_RX_NBL_FLAGS_IS_INJECTED))
{
ULONG pagePriority;
PNET_BUFFER netBuffer;
PMDL mdl;
PUCHAR injectBuffer;
netBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
mdl = NET_BUFFER_FIRST_MDL(netBuffer);
//
// On Windows versions 8 and above, the MDL can be marked as not executable.
// This is required for the driver to function under HyperVisor-enforced
// Code Integrity (HVCI).
//
pagePriority = NormalPagePriority;
if (GlobalData.RunningWindows8OrGreater != FALSE) {
pagePriority |= MdlMappingNoExecute;
}
injectBuffer = (PUCHAR )MmGetSystemAddressForMdlSafe(mdl,pagePriority);
if(injectBuffer)
{
NdisFreeMemory(injectBuffer,0,0);
}
NdisFreeMdl(mdl);
}
//
// Complete the IRP
//
irp = (PIRP )NetBufferList->MiniportReserved[0];
if(irp)
{
irp->IoStatus.Status = IoCompletionStatus;
IoCompleteRequest(irp, IO_NO_INCREMENT);
}
// Decrement in-flight receive NBL count.
nblCount = NdisInterlockedDecrement(&Adapter->ReceiveNblInFlightCount);
ASSERT(nblCount >= 0 );
if (0 == nblCount)
{
NdisSetEvent(&Adapter->ReceiveNblInFlightCountZeroEvent);
}
// Free the NBL
NdisFreeNetBufferList(NetBufferList);
}
示例9: USBPORT_HandleSubmitURB
//.........这里部分代码省略.........
case URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL:
Status = USBPORT_SyncResetPipeAndClearStall(PdoExtension->FdoDevice,
Irp,
Urb);
break;
case URB_FUNCTION_SYNC_RESET_PIPE:
Status = USBPORT_ResetPipe(PdoExtension->FdoDevice,
Irp,
Urb);
break;
case URB_FUNCTION_SYNC_CLEAR_STALL:
Status = USBPORT_ClearStall(PdoExtension->FdoDevice,
Irp,
Urb);
break;
case URB_FUNCTION_ABORT_PIPE:
Status = USBPORT_AbortPipe(PdoExtension->FdoDevice,
Irp,
Urb);
break;
case URB_FUNCTION_SET_FEATURE_TO_DEVICE:
case URB_FUNCTION_SET_FEATURE_TO_INTERFACE:
case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT:
case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE:
case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT:
case URB_FUNCTION_CLEAR_FEATURE_TO_OTHER:
case URB_FUNCTION_SET_FEATURE_TO_OTHER:
Status = USBPORT_ValidateURB(FdoDevice, Irp, Urb, TRUE, TRUE);
if (!NT_SUCCESS(Status))
{
DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
break;
}
Status = USBPORT_HandleSetOrClearFeature(Urb);
break;
case URB_FUNCTION_GET_CURRENT_FRAME_NUMBER:
Status = USBPORT_HandleGetCurrentFrame(PdoExtension->FdoDevice,
Irp,
Urb);
break;
case URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL:
DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL (0x03) NOT_SUPPORTED\n");
return USBPORT_USBDStatusToNtStatus(Urb, USBD_STATUS_NOT_SUPPORTED);
case URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL:
DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL (0x04) NOT_SUPPORTED\n");
return USBPORT_USBDStatusToNtStatus(Urb, USBD_STATUS_NOT_SUPPORTED);
case URB_FUNCTION_GET_FRAME_LENGTH:
DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_GET_FRAME_LENGTH (0x05) NOT_SUPPORTED\n");
return USBPORT_USBDStatusToNtStatus(Urb, USBD_STATUS_NOT_SUPPORTED);
case URB_FUNCTION_SET_FRAME_LENGTH:
DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_SET_FRAME_LENGTH (0x06) NOT_SUPPORTED\n");
return USBPORT_USBDStatusToNtStatus(Urb, USBD_STATUS_NOT_SUPPORTED);
default:
DPRINT1("USBPORT_HandleSubmitURB: Unknown URB Function - %x\n",
Function);
//URB_FUNCTION_RESERVED_0X0016
//URB_FUNCTION_RESERVE_0X001D
//URB_FUNCTION_RESERVE_0X002B
//URB_FUNCTION_RESERVE_0X002C
//URB_FUNCTION_RESERVE_0X002D
//URB_FUNCTION_RESERVE_0X002E
//URB_FUNCTION_RESERVE_0X002F
break;
}
if (Status == STATUS_PENDING)
{
return Status;
}
if (Urb->UrbHeader.UsbdFlags & USBD_FLAG_ALLOCATED_TRANSFER)
{
PUSBPORT_TRANSFER Transfer;
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
Urb->UrbControlTransfer.hca.Reserved8[0] = NULL;
Urb->UrbHeader.UsbdFlags |= ~USBD_FLAG_ALLOCATED_TRANSFER;
ExFreePoolWithTag(Transfer, USB_PORT_TAG);
}
InterlockedDecrement(&DeviceHandle->DeviceHandleLock);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
示例10: AFSProcessQueuedResults
NTSTATUS
AFSProcessQueuedResults( IN BOOLEAN CancelRequest)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSLibraryQueueRequestCB *pRequest = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
__Enter
{
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
AFS_TRACE_LEVEL_VERBOSE,
"%s Entry\n",
__FUNCTION__));
//
// Loop through the queue either resubmitting requests or cancelling them
//
while( TRUE)
{
AFSAcquireExcl( &pDevExt->Specific.Control.LibraryQueueLock,
TRUE);
if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
{
AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
break;
}
pRequest = pDevExt->Specific.Control.LibraryQueueHead;
pDevExt->Specific.Control.LibraryQueueHead = pRequest->fLink;
if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
{
pDevExt->Specific.Control.LibraryQueueTail = NULL;
}
AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
if( CancelRequest)
{
pRequest->Irp->IoStatus.Status = STATUS_CANCELLED;
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
AFS_TRACE_LEVEL_VERBOSE,
"%s Cancelling request Irp %p\n",
__FUNCTION__,
pRequest->Irp));
IoCompleteRequest( pRequest->Irp,
IO_NO_INCREMENT);
}
else
{
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
AFS_TRACE_LEVEL_VERBOSE,
"%s Resubmitting request Irp %p\n",
__FUNCTION__,
pRequest->Irp));
AFSSubmitLibraryRequest( pRequest->Irp);
}
ExFreePool( pRequest);
}
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
AFS_TRACE_LEVEL_VERBOSE,
"%s Completed\n",
__FUNCTION__));
}
return ntStatus;
}
示例11: Bus_FDO_PnP
NTSTATUS
Bus_FDO_PnP (
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp,
__in PIO_STACK_LOCATION IrpStack,
__in PFDO_DEVICE_DATA DeviceData
)
/*++
Routine Description:
Handle requests from the Plug & Play system for the BUS itself
--*/
{
NTSTATUS status;
ULONG length, prevcount, numPdosPresent;
PLIST_ENTRY entry, listHead, nextEntry;
PPDO_DEVICE_DATA pdoData;
PDEVICE_RELATIONS relations, oldRelations;
PAGED_CODE ();
Bus_IncIoCount (DeviceData);
switch (IrpStack->MinorFunction) {
case IRP_MN_START_DEVICE:
//
// Send the Irp down and wait for it to come back.
// Do not touch the hardware until then.
//
status = Bus_SendIrpSynchronously (DeviceData->NextLowerDriver, Irp);
if (NT_SUCCESS(status)) {
//
// Initialize your device with the resources provided
// by the PnP manager to your device.
//
status = Bus_StartFdo (DeviceData, Irp);
}
//
// We must now complete the IRP, since we stopped it in the
// completion routine with MORE_PROCESSING_REQUIRED.
//
Irp->IoStatus.Status = status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
Bus_DecIoCount (DeviceData);
return status;
case IRP_MN_QUERY_STOP_DEVICE:
//
// The PnP manager is trying to stop the device
// for resource rebalancing. Fail this now if you
// cannot stop the device in response to STOP_DEVICE.
//
SET_NEW_PNP_STATE(DeviceData, StopPending);
Irp->IoStatus.Status = STATUS_SUCCESS; // You must not fail the IRP.
break;
case IRP_MN_CANCEL_STOP_DEVICE:
//
// The PnP Manager sends this IRP, at some point after an
// IRP_MN_QUERY_STOP_DEVICE, to inform the drivers for a
// device that the device will not be stopped for
// resource reconfiguration.
//
//
// First check to see whether you have received cancel-stop
// without first receiving a query-stop. This could happen if
// someone above us fails a query-stop and passes down the subsequent
// cancel-stop.
//
if (StopPending == DeviceData->DevicePnPState)
{
//
// We did receive a query-stop, so restore.
//
RESTORE_PREVIOUS_PNP_STATE(DeviceData);
ASSERT(DeviceData->DevicePnPState == Started);
}
Irp->IoStatus.Status = STATUS_SUCCESS; // We must not fail the IRP.
break;
case IRP_MN_STOP_DEVICE:
//
// Stop device means that the resources given during Start device
// are now revoked. Note: You must not fail this Irp.
// But before you relieve resources make sure there are no I/O in
// progress. Wait for the existing ones to be finished.
// To do that, first we will decrement this very operation.
// When the counter goes to 1, Stop event is set.
//.........这里部分代码省略.........
示例12: Bus_PnP
NTSTATUS
Bus_PnP (
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
)
/*++
Routine Description:
Handles PnP Irps sent to both FDO and child PDOs.
Arguments:
DeviceObject - Pointer to deviceobject
Irp - Pointer to a PnP Irp.
Return Value:
NT Status is returned.
--*/
{
PIO_STACK_LOCATION irpStack;
NTSTATUS status;
PCOMMON_DEVICE_DATA commonData;
PAGED_CODE ();
KdPrint(("Bus_PnP\r\n"));
irpStack = IoGetCurrentIrpStackLocation (Irp);
ASSERT (IRP_MJ_PNP == irpStack->MajorFunction);
commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension;
//
// If the device has been removed, the driver should
// not pass the IRP down to the next lower driver.
//
if (commonData->DevicePnPState == Deleted) {
Irp->IoStatus.Status = status = STATUS_NO_SUCH_DEVICE ;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return status;
}
if (commonData->IsFDO) {
Bus_KdPrint (commonData, BUS_DBG_PNP_TRACE,
("FDO %s IRP:0x%p\n",
PnPMinorFunctionString(irpStack->MinorFunction),
Irp));
//
// Request is for the bus FDO
//
status = Bus_FDO_PnP (
DeviceObject,
Irp,
irpStack,
(PFDO_DEVICE_DATA) commonData);
} else {
Bus_KdPrint (commonData, BUS_DBG_PNP_TRACE,
("PDO %s IRP: 0x%p\n",
PnPMinorFunctionString(irpStack->MinorFunction),
Irp));
//
// Request is for the child PDO.
//
status = Bus_PDO_PnP (
DeviceObject,
Irp,
irpStack,
(PPDO_DEVICE_DATA) commonData);
}
return status;
}
示例13: HelloDDKRead
NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("DriverB:Enter B HelloDDKRead\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING DeviceName;
RtlInitUnicodeString( &DeviceName, L"\\Device\\MyDDKDeviceA" );
PDEVICE_OBJECT DeviceObject = NULL;
PFILE_OBJECT FileObject = NULL;
//得到设备对象指针
ntStatus = IoGetDeviceObjectPointer(&DeviceName,FILE_ALL_ACCESS,&FileObject,&DeviceObject);
KdPrint(("DriverB:FileObject:%x\n",FileObject));
KdPrint(("DriverB:DeviceObject:%x\n",DeviceObject));
if (!NT_SUCCESS(ntStatus))
{
KdPrint(("DriverB:IoGetDeviceObjectPointer() 0x%x\n", ntStatus ));
ntStatus = STATUS_UNSUCCESSFUL;
// 完成IRP
pIrp->IoStatus.Status = ntStatus;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("DriverB:Leave B HelloDDKRead\n"));
return ntStatus;
}
KEVENT event;
KeInitializeEvent(&event,NotificationEvent,FALSE);
IO_STATUS_BLOCK status_block;
LARGE_INTEGER offsert = RtlConvertLongToLargeInteger(0);
//创建异步IRP
PIRP pNewIrp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
DeviceObject,
NULL,0,
&offsert,&status_block);
KdPrint(("pNewIrp->UserEvent :%x\n",pNewIrp->UserEvent));
//设置pNewIrp->UserEvent,这样在IRP完成后可以通知该事件
pNewIrp->UserEvent = &event;
KdPrint(("DriverB:pNewIrp:%x\n",pNewIrp));
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(pNewIrp);
stack->FileObject = FileObject;
NTSTATUS status = IoCallDriver(DeviceObject,pNewIrp);
if (status == STATUS_PENDING) {
status = KeWaitForSingleObject(
&event,
Executive,
KernelMode,
FALSE, // Not alertable
NULL);
status = status_block.Status;
}
ZwClose(FileObject);
//关闭设备句柄
ObDereferenceObject( FileObject );
ntStatus = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = ntStatus;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("DriverB:Leave B HelloDDKRead\n"));
return ntStatus;
}
示例14: ndisprotServiceReads
//.........这里部分代码省略.........
if (FoundPendingIrp == FALSE)
{
break;
}
//
// Get the first queued receive packet
//
pRcvNetBufListEntry = pOpenContext->RecvNetBufListQueue.Flink;
NPROT_REMOVE_ENTRY_LIST(pRcvNetBufListEntry);
pOpenContext->RecvNetBufListCount --;
NPROT_RELEASE_LOCK(&pOpenContext->Lock, FALSE);
NPROT_DEREF_OPEN(pOpenContext); // Service: dequeue rcv packet
pRcvNetBufList = NPROT_RCV_NBL_FROM_LIST_ENTRY(pRcvNetBufListEntry);
NPROT_ASSERT(pRcvNetBufList != NULL);
_Analysis_assume_(pRcvNetBufList != NULL);
NPROT_RCV_NBL_FROM_LIST_ENTRY(pRcvNetBufListEntry) = NULL;
//
// Copy as much data as possible from the receive packet to
// the IRP MDL.
//
pDst = NULL;
NdisQueryMdl(pIrp->MdlAddress, &pDst, &BytesRemaining, NormalPagePriority);
NPROT_ASSERT(pDst != NULL); // since it was already mapped
_Analysis_assume_(pDst != NULL);
pMdl = NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(pRcvNetBufList));
//
// Copy the data in the received packet into the buffer provided by the client.
// If the length of the receive packet is greater than length of the given buffer,
// we just copy as many bytes as we can. Once the buffer is full, we just discard
// the rest of the data, and complete the IRP sucessfully even we only did a partial copy.
//
SrcTotalLength = NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pRcvNetBufList));
Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NET_BUFFER_LIST_FIRST_NB(pRcvNetBufList));
while (BytesRemaining && (pMdl != NULL) && SrcTotalLength)
{
pSrc = NULL;
NdisQueryMdl(pMdl, &pSrc, &BytesAvailable, NormalPagePriority);
if (pSrc == NULL)
{
DEBUGP(DL_FATAL,
("ServiceReads: Open %p, NdisQueryMdl failed for MDL %p\n",
pOpenContext, pMdl));
break;
}
NPROT_ASSERT(BytesAvailable > Offset);
BytesToCopy = MIN(BytesAvailable - Offset, BytesRemaining);
BytesToCopy = MIN(BytesToCopy, SrcTotalLength);
NPROT_COPY_MEM(pDst, pSrc + Offset, BytesToCopy);
BytesRemaining -= BytesToCopy;
pDst += BytesToCopy;
SrcTotalLength -= BytesToCopy;
//
// CurrentMdlOffset is used only for the first Mdl processed. For the remaining Mdls, it is 0.
//
Offset = 0;
NdisGetNextMdl(pMdl, &pMdl);
}
//
// Complete the IRP.
//
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = MmGetMdlByteCount(pIrp->MdlAddress) - BytesRemaining;
DEBUGP(DL_INFO, ("ServiceReads: Open %p, IRP %p completed with %d bytes\n",
pOpenContext, pIrp, (ULONG)pIrp->IoStatus.Information));
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
ndisprotFreeReceiveNetBufferList(pOpenContext, pRcvNetBufList,FALSE);
NPROT_DEREF_OPEN(pOpenContext); // took out pended Read
NPROT_ACQUIRE_LOCK(&pOpenContext->Lock, FALSE);
pOpenContext->PendedReadCount--;
}
NPROT_RELEASE_LOCK(&pOpenContext->Lock, FALSE);
NPROT_DEREF_OPEN(pOpenContext); // temp ref - service reads
}
示例15: Bus_IoCtl
NTSTATUS
Bus_IoCtl (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
Handle user mode PlugIn, UnPlug and device Eject requests.
Arguments:
DeviceObject - pointer to a device object.
Irp - pointer to an I/O Request Packet.
Return Value:
NT status code
--*/
{
PIO_STACK_LOCATION irpStack;
NTSTATUS status;
ULONG inlen, outlen;
PFDO_DEVICE_DATA fdoData;
PVOID buffer;
PAGED_CODE ();
//
// It is not safe to call IOCTL in raised IRQL.
//
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
fdoData = (PFDO_DEVICE_DATA) DeviceObject->DeviceExtension;
//
// We only take Device Control requests for the FDO.
// That is the bus itself.
//
if (!fdoData->IsFDO) {
//
// These commands are only allowed to go to the FDO.
//
status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Status = status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return status;
}
//
// Check to see whether the bus is removed
//
if (fdoData->DevicePnPState == Deleted) {
Irp->IoStatus.Status = status = STATUS_NO_SUCH_DEVICE;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return status;
}
Bus_IncIoCount (fdoData);
irpStack = IoGetCurrentIrpStackLocation (Irp);
buffer = Irp->AssociatedIrp.SystemBuffer;
inlen = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outlen = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
status = STATUS_INVALID_PARAMETER;
Bus_KdPrint(fdoData, BUS_DBG_IOCTL_TRACE, ("%d called\n", irpStack->Parameters.DeviceIoControl.IoControlCode));
switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_NDASBUS_ADD_TARGET:
{
PPDO_DEVICE_DATA pdoData;
Bus_KdPrint(fdoData, BUS_DBG_IOCTL_ERROR, ("IOCTL_NDASBUS_ADD_TARGET inlen %d, outlen %d, sizeof(NDASBUS_ADD_TARGET_DATA) %d\n", inlen, outlen, sizeof(NDASBUS_ADD_TARGET_DATA)));
if ((inlen == outlen) &&
(sizeof(NDASBUS_ADD_TARGET_DATA) <= inlen))
{
ULONG ulSize;
PNDASBUS_ADD_TARGET_DATA addTargetData = buffer;
BOOLEAN accepted;
Bus_KdPrint(fdoData, BUS_DBG_IOCTL_TRACE, ("IOCTL_NDASBUS_ADD_TARGET called\n"));
Bus_KdPrint(fdoData, BUS_DBG_IOCTL_ERROR, ("IOCTL_NDASBUS_ADD_TARGET Target Type %d\n", addTargetData->ucTargetType));
status = STATUS_SUCCESS;
//
// Check structure size
//
//.........这里部分代码省略.........