windows-nt/Source/XPSP1/NT/drivers/dot4/dot4usb/util.c
2020-09-26 16:20:57 +08:00

189 lines
5.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
Dot4Usb.sys - Lower Filter Driver for Dot4.sys for USB connected
IEEE 1284.4 devices.
File Name:
Util.c
Abstract:
Misc. Utility functions
Environment:
Kernel mode only
Notes:
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
Copyright (c) 2000 Microsoft Corporation. All Rights Reserved.
Revision History:
01/18/2000 : created
ToDo in this file:
- code review and doc
- code review w/Joby
Author(s):
Joby Lafky (JobyL)
Doug Fritz (DFritz)
****************************************************************************/
#include "pch.h"
/************************************************************************/
/* DispatchPassThrough */
/************************************************************************/
//
// Routine Description:
//
// Default dispatch routine for IRP_MJ_xxx that we don't explicitly
// handle. Pass the request down to the device object below us.
//
// Arguments:
//
// DevObj - pointer to Device Object that is the target of the request
// Irp - pointer to request
//
// Return Value:
//
// NTSTATUS
//
// Log:
// 2000-05-03 Code Reviewed - TomGreen, JobyL, DFritz
//
/************************************************************************/
NTSTATUS
DispatchPassThrough(
IN PDEVICE_OBJECT DevObj,
IN PIRP Irp
)
{
PDEVICE_EXTENSION devExt = DevObj->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock( &devExt->RemoveLock, Irp );
if( NT_SUCCESS(status) ) {
// RemoveLock acquired, continue with request
IoSkipCurrentIrpStackLocation( Irp );
status = IoCallDriver( devExt->LowerDevObj, Irp );
IoReleaseRemoveLock( &devExt->RemoveLock, Irp );
} else {
// unable to acquire RemoveLock - FAIL request
Irp->IoStatus.Status = status;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
}
return status;
}
/************************************************************************/
/* CallLowerDriverSync */
/************************************************************************/
//
// Routine Description:
//
// Call the driver below us synchronously. When this routine returns
// the calling routine once again owns the IRP.
//
// This routine acquires and holds a RemoveLock against the IRP
// while the IRP is in the possession of drivers below us.
//
// Arguments:
//
// DevObj - pointer to Device Object that is issuing the request
// Irp - pointer to request
//
// Return Value:
//
// NTSTATUS
//
/************************************************************************/
NTSTATUS
CallLowerDriverSync(
IN PDEVICE_OBJECT DevObj,
IN PIRP Irp
)
{
PDEVICE_EXTENSION devExt = DevObj->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock( &devExt->RemoveLock, Irp );
if( NT_SUCCESS(status) ) {
KEVENT event;
KeInitializeEvent( &event, NotificationEvent, FALSE );
IoSetCompletionRoutine( Irp, CallLowerDriverSyncCompletion, &event, TRUE, TRUE, TRUE );
status = IoCallDriver( devExt->LowerDevObj, Irp );
if( STATUS_PENDING == status ) {
KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
status = Irp->IoStatus.Status;
}
IoReleaseRemoveLock( &devExt->RemoveLock, Irp );
} else {
TR_FAIL(("util::CallLowerDriverSync - Couldn't aquire RemoveLock"));
}
return status;
}
/************************************************************************/
/* CallLowerDriverSyncCompletion */
/************************************************************************/
//
// Routine Description:
//
// This is the completion routine for CallLowerDriverSync() that
// simply signals the event and stops the IRP completion from
// unwinding so that CallLowerDriverSync() can regain ownership
// of the IRP.
//
// Arguments:
//
// DevObjOrNULL - Usually, this is this driver's device object.
// However, if this driver created the IRP, then
// there is no stack location in the IRP for this
// driver; so the kernel has no place to store the
// device object; ** so devObj will be NULL in
// this case **.
// Irp - pointer to request
//
// Return Value:
//
// NTSTATUS
//
/************************************************************************/
NTSTATUS
CallLowerDriverSyncCompletion(
IN PDEVICE_OBJECT DevObjOrNULL,
IN PIRP Irp,
IN PVOID Context
)
{
PKEVENT event = Context;
UNREFERENCED_PARAMETER( DevObjOrNULL );
UNREFERENCED_PARAMETER( Irp );
KeSetEvent(event, 0, FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}