378 lines
7.8 KiB
C
378 lines
7.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
dispatch.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the dispatch routines for SAC.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Sean Selitrennikoff (v-seans) - Jan 13, 1999
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "sac.h"
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DispatchClose(
|
|||
|
IN PSAC_DEVICE_CONTEXT DeviceContext,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DispatchCreate(
|
|||
|
IN PSAC_DEVICE_CONTEXT DeviceContext,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CancelReceiveIrp(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CompleteSendIrp (
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CancelSendIrp(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
Dispatch(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This is the dispatch routine for SAC.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to device object for target device
|
|||
|
|
|||
|
Irp - Pointer to I/O request packet
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS -- Indicates whether the request was successfully queued.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PSAC_DEVICE_CONTEXT DeviceContext = (PSAC_DEVICE_CONTEXT)DeviceObject->DeviceExtension;
|
|||
|
PIO_STACK_LOCATION IrpSp;
|
|||
|
NTSTATUS Status;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC Dispatch: Entering.\n")));
|
|||
|
|
|||
|
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
|||
|
|
|||
|
switch (IrpSp->MajorFunction) {
|
|||
|
|
|||
|
case IRP_MJ_CREATE:
|
|||
|
|
|||
|
Status = DispatchCreate(DeviceContext, Irp);
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC Dispatch: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
|
|||
|
case IRP_MJ_CLEANUP:
|
|||
|
|
|||
|
Status = STATUS_SUCCESS;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC Dispatch: Exiting cleanup status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
|
|||
|
case IRP_MJ_CLOSE:
|
|||
|
|
|||
|
Status = DispatchClose(DeviceContext, Irp);
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC Dispatch: Exiting close status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
|
|||
|
case IRP_MJ_DEVICE_CONTROL:
|
|||
|
|
|||
|
Status = DispatchDeviceControl(DeviceObject, Irp);
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC Dispatch: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
|
|||
|
default:
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FAILS,
|
|||
|
KdPrint(( "SAC Dispatch: Invalid major function %lx\n", IrpSp->MajorFunction )));
|
|||
|
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
|||
|
IoCompleteRequest(Irp, DeviceContext->PriorityBoost);
|
|||
|
|
|||
|
Status = STATUS_NOT_IMPLEMENTED;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC Dispatch: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
} // Dispatch
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DispatchDeviceControl(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This is the dispatch routine for SAC IOCTLs.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to device object for target device
|
|||
|
|
|||
|
Irp - Pointer to I/O request packet
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS -- Indicates whether the request was successfully queued.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
|
|||
|
PSAC_DEVICE_CONTEXT DeviceContext = (PSAC_DEVICE_CONTEXT)DeviceObject;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchDeviceControl: Entering.\n")));
|
|||
|
|
|||
|
//
|
|||
|
// If we made it this far, then the ioctl is invalid.
|
|||
|
//
|
|||
|
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
|
|||
|
IoCompleteRequest(Irp, DeviceContext->PriorityBoost);
|
|||
|
|
|||
|
Status = STATUS_INVALID_DEVICE_REQUEST;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC DispatchDeviceControl: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
|
|||
|
} // DispatchDeviceControl
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DispatchShutdownControl(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This is the dispatch routine which receives the shutdown IRP.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to device object for target device
|
|||
|
|
|||
|
Irp - Pointer to I/O request packet
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS -- Indicates whether the request was successfully queued.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER(DeviceObject);
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchShutdownControl: Entering.\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Notify any user.
|
|||
|
//
|
|||
|
SacPutSimpleMessage(SAC_ENTER);
|
|||
|
SacPutSimpleMessage(SAC_SHUTDOWN);
|
|||
|
SacPutSimpleMessage(SAC_ENTER);
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchShutdownControl: Exiting.\n")));
|
|||
|
|
|||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|||
|
|
|||
|
return STATUS_SUCCESS;
|
|||
|
|
|||
|
} // DispatchShutdownControl
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DispatchCreate(
|
|||
|
IN PSAC_DEVICE_CONTEXT DeviceContext,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This is the dispatch routine for SAC IOCTL Create
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceContext - Pointer to device context for target device
|
|||
|
|
|||
|
Irp - Pointer to I/O request packet
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS -- Indicates whether the request was successfully queued.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
PIO_STACK_LOCATION IrpSp;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchCreate: Entering.\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Check to see if we are done initializing.
|
|||
|
//
|
|||
|
if (!GlobalDataInitialized || !DeviceContext->InitializedAndReady) {
|
|||
|
|
|||
|
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_STATE;
|
|||
|
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
|
|||
|
|
|||
|
Status = STATUS_INVALID_DEVICE_STATE;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC DispatchCreate: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Get a pointer to the current stack location in the IRP. This is where
|
|||
|
// the function codes and parameters are stored.
|
|||
|
//
|
|||
|
IrpSp = IoGetCurrentIrpStackLocation (Irp);
|
|||
|
|
|||
|
//
|
|||
|
// Case on the function that is being performed by the requestor. If the
|
|||
|
// operation is a valid one for this device, then make it look like it was
|
|||
|
// successfully completed, where possible.
|
|||
|
//
|
|||
|
switch (IrpSp->MajorFunction) {
|
|||
|
|
|||
|
//
|
|||
|
// The Create function opens a connection to this device.
|
|||
|
//
|
|||
|
case IRP_MJ_CREATE:
|
|||
|
|
|||
|
Status = STATUS_UNSUCCESSFUL;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
Status = STATUS_INVALID_DEVICE_REQUEST;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
Irp->IoStatus.Status = Status;
|
|||
|
Irp->IoStatus.Information = 0;
|
|||
|
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
|
|||
|
|
|||
|
//
|
|||
|
// Return the immediate status code to the caller.
|
|||
|
//
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC DispatchCreate: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DispatchClose(
|
|||
|
IN PSAC_DEVICE_CONTEXT DeviceContext,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This is the dispatch routine for SAC IOCTL Close
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceContext - Pointer to device context for target device
|
|||
|
|
|||
|
Irp - Pointer to I/O request packet
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS -- Indicates whether the request was successfully queued.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchClose: Entering.\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Check to see if we are done initializing.
|
|||
|
//
|
|||
|
if (!GlobalDataInitialized || !DeviceContext->InitializedAndReady) {
|
|||
|
|
|||
|
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_STATE;
|
|||
|
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
|
|||
|
|
|||
|
Status = STATUS_INVALID_DEVICE_STATE;
|
|||
|
|
|||
|
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
|
|||
|
KdPrint(("SAC DispatchClose: Exiting with status 0x%x\n", Status)));
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|||
|
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
|
|||
|
|
|||
|
Status = STATUS_UNSUCCESSFUL;
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|