|
|
/*++
Copyright (C) Microsoft Corporation, 2000
Module Name:
utils.c
Abstract:
Utility routines for iScsi Port driver
Environment:
kernel mode only
Revision History:
--*/
#include "port.h"
PVOID iSpAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ) { PVOID Block; Block = ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag); if (Block != NULL) { RtlZeroMemory(Block, NumberOfBytes); }
return Block; }
NTSTATUS iSpAllocateMdlAndIrp( IN PVOID Buffer, IN ULONG BufferLen, IN CCHAR StackSize, IN BOOLEAN NonPagedPool, OUT PIRP *Irp, OUT PMDL *Mdl ) { PMDL localMdl = NULL; PIRP localIrp = NULL; NTSTATUS status;
//
// Allocate an MDL for this request
//
localMdl = IoAllocateMdl(Buffer, BufferLen, FALSE, FALSE, NULL); if (localMdl == NULL) { DebugPrint((0, "iSpAllocateMdlAndIrp : Failed to allocate MDL\n")); return STATUS_INSUFFICIENT_RESOURCES; }
//
// Initialize the MDL. If the buffer is from NonPaged pool
// use MmBuildMdlForNonPagedPool. Else, use MmProbeAndLockPages
//
if (NonPagedPool == TRUE) { MmBuildMdlForNonPagedPool(localMdl); } else {
try { MmProbeAndLockPages(localMdl, KernelMode, IoModifyAccess); } except(EXCEPTION_EXECUTE_HANDLER) {
DebugPrint((0, "iSpAllocateMdlAndIrp : Failed to Lockpaged\n")); IoFreeMdl(localMdl); return STATUS_INSUFFICIENT_RESOURCES; } }
//
// Allocate an IRP
//
localIrp = IoAllocateIrp(StackSize, FALSE); if (localIrp == NULL) { DebugPrint((0, "iSpAllocateMdlAndIrp. Failed to allocate IRP\n")); IoFreeMdl(localMdl); return STATUS_INSUFFICIENT_RESOURCES; }
DebugPrint((3, "Allocated IRP 0x%08x and MDL 0x%08x\n", localIrp, localMdl));
*Irp = localIrp; *Mdl = localMdl; return STATUS_SUCCESS; }
VOID iSpFreeMdlAndIrp( IN PMDL Mdl, IN PIRP Irp, BOOLEAN UnlockPages ) { PMDL tmpMdlPtr = NULL;
if (Irp == NULL) { return; }
//
// Free any MDLs allocated for this IRP
//
if (Mdl != NULL) { while ((Irp->MdlAddress) != NULL) { tmpMdlPtr = (Irp->MdlAddress)->Next;
if (UnlockPages) { MmUnlockPages(Irp->MdlAddress); }
IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = tmpMdlPtr; } }
IoFreeIrp(Irp); }
|