windows-nt/Source/XPSP1/NT/drivers/storage/iscsiprt/server/utils.c
2020-09-26 16:20:57 +08:00

140 lines
2.7 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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);
}