mirror of https://github.com/tongzx/nt5src
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.
139 lines
2.7 KiB
139 lines
2.7 KiB
/*++
|
|
|
|
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);
|
|
}
|