Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
io.c
Abstract:
Author:
Thomas J. Dimitri (TommyD) 08-May-1992
Environment:
Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.
Revision History:
--*/ #include "asyncall.h"
// asyncmac.c will define the global parameters.
#include "globals.h"
NTSTATUS AsyncSetupIrp( IN PASYNC_FRAME Frame, IN PIRP irp )
/*++
This is the routine which intializes the Irp
--*/ { // PMDL mdl;
PDEVICE_OBJECT deviceObject=Frame->Info->DeviceObject; PFILE_OBJECT fileObject=Frame->Info->FileObject;
irp->Tail.Overlay.OriginalFileObject = fileObject; irp->RequestorMode = KernelMode; irp->PendingReturned = FALSE;
//
// Fill in the service independent parameters in the IRP.
//
irp->UserEvent = NULL; irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL; irp->Overlay.AsynchronousParameters.UserApcContext = NULL;
//
// Now determine whether this device expects to have data buffered to it
// or whether it performs direct I/O. This is based on the DO_BUFFERED_IO
// flag in the device object. If the flag is set, then a system buffer is
// allocated and the caller's data is copied into it. Otherwise, a Memory
// Descriptor List (MDL) is allocated and the caller's buffer is locked
// down using it.
//
if (deviceObject->Flags & DO_BUFFERED_IO) {
//
// The device does not support direct I/O. Allocate a system buffer,
// and copy the caller's data into it. This is done using an
// exception handler that will perform cleanup if the operation
// fails. Note that this is only done if the operation has a non-zero
// length.
//
irp->AssociatedIrp.SystemBuffer = Frame->Frame;
//
// Set the IRP_BUFFERED_IO flag in the IRP so that I/O completion
// will know that this is not a direct I/O operation.
//
irp->Flags = IRP_BUFFERED_IO;
} else if (deviceObject->Flags & DO_DIRECT_IO) {
//
// This is a direct I/O operation. Allocate an MDL and invoke the
// memory management routine to lock the buffer into memory. This
// is done using an exception handler that will perform cleanup if
// the operation fails. Note that no MDL is allocated, nor is any
// memory probed or locked if the length of the request was zero.
//
#if DBG
DbgPrintf(("The DeviceObject is NOT BUFFERED_IO!! IRP FAILURE!!\n"));
DbgBreakPoint(); #endif
} else {
//
// Pass the address of the caller's buffer to the device driver. It
// is now up to the driver to do everything.
//
irp->UserBuffer = Frame->Frame;
}
// For now, if we get this far, it means success!
return(STATUS_SUCCESS); }
PASYNC_IO_CTX AsyncAllocateIoCtx( BOOLEAN AllocateSync, PVOID Context ) { PASYNC_IO_CTX AsyncIoCtx;
AsyncIoCtx = ExAllocateFromNPagedLookasideList(&AsyncIoCtxList);
if (AsyncIoCtx == NULL) { return (NULL); }
RtlZeroMemory(AsyncIoCtx, sizeof(ASYNC_IO_CTX)); AsyncIoCtx->Context = Context; AsyncIoCtx->Sync = AllocateSync; if (AllocateSync) { ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL); KeInitializeEvent(&AsyncIoCtx->Event, SynchronizationEvent, (BOOLEAN)FALSE); }
return (AsyncIoCtx); }
VOID AsyncFreeIoCtx( PASYNC_IO_CTX AsyncIoCtx ) { ExFreeToNPagedLookasideList(&AsyncIoCtxList, AsyncIoCtx); }
|