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;
|
||
}
|
||
|