Kernel-Mode
Skeleton I/O Dispatch Handlers

Copyright © 2003 by Printing Communications Assoc., Inc. (PCAUSA). All rights reserved

These are the skeleton I/O dispatch handlers that are implemented in PTExtend.c. These are sufficient for a quick-and-dirty test of opening and closing a handle on the PassThru device. More functionality will be added.

NTSTATUS
DevOpen(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
	
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
	
    pIrpSp->FileObject->FsContext = NULL;
    pIrpSp->FileObject->FsContext2 = NULL;
	
    DBGPRINT(("==>Pt DevOpen: FileObject %p\n", pIrpSp->FileObject));
	
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = NtStatus;
	
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    DBGPRINT(("<== Pt DevOpen\n"));
	
    return NtStatus;
} 
NTSTATUS
DevCleanup(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
	
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
	
    DBGPRINT(("==>Pt DevCleanup: FileObject %p\n", pIrpSp->FileObject ));
	
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = NtStatus;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    DBGPRINT(("<== Pt DevCleanup\n"));
	
    return NtStatus;
} 
NTSTATUS
DevClose(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
	
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
	
    DBGPRINT(("==>Pt DevClose: FileObject %p\n", pIrpSp->FileObject ));
	
    pIrpSp->FileObject->FsContext = NULL;
    pIrpSp->FileObject->FsContext2 = NULL;
	
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = NtStatus;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    DBGPRINT(("<== Pt DevClose\n"));
	
    return NtStatus;
} 
NTSTATUS
DevIoControl(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
    ULONG               BytesReturned = 0;
    ULONG               FunctionCode;
    PUCHAR              ioBuffer = NULL;
    ULONG               inputBufferLength;
    ULONG               outputBufferLength;
    
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
    
    ioBuffer = pIrp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = pIrpSp->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = pIrpSp->Parameters.DeviceIoControl.OutputBufferLength;
    
    FunctionCode = pIrpSp->Parameters.DeviceIoControl.IoControlCode;
    
    DBGPRINT(("==>Pt DevIoControl: FileObject %p\n", pIrpSp->FileObject ));
    
    switch (FunctionCode)
    {
        case IOCTL_PTUSERIO_ENUMERATE:
        case IOCTL_PTUSERIO_OPEN_LOWER_ADAPTER:
        case IOCTL_PTUSERIO_OPEN_VIRTUAL_ADAPTER:
        case IOCTL_PTUSERIO_QUERY_INFORMATION:
        case IOCTL_PTUSERIO_SET_INFORMATION:
        default:
            NtStatus = STATUS_NOT_SUPPORTED;
            break;
    }
    
    if (NtStatus != STATUS_PENDING)
    {
        pIrp->IoStatus.Information = BytesReturned;
        pIrp->IoStatus.Status = NtStatus;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    }
    
    DBGPRINT(("<== Pt DevIoControl\n"));
    
    return NtStatus;
}