129 lines
3 KiB
C++
129 lines
3 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// Module: alloc.c
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
//@@BEGIN_MSINTERNAL
|
|
// Development Team:
|
|
// Mike McLaughlin
|
|
//
|
|
// History: Date Author Comment
|
|
//
|
|
// To Do: Date Author Comment
|
|
//
|
|
//@@END_MSINTERNAL
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
// PURPOSE.
|
|
//
|
|
// Copyright (c) 1996-1999 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "common.h"
|
|
|
|
//---------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------
|
|
|
|
NTSTATUS
|
|
AllocatorDispatchCreate(
|
|
IN PDEVICE_OBJECT pDeviceObject,
|
|
IN PIRP pIrp
|
|
)
|
|
{
|
|
PSTART_NODE_INSTANCE pStartNodeInstance;
|
|
PKSALLOCATOR_FRAMING pAllocatorFraming;
|
|
PINSTANCE pInstance = NULL;
|
|
NTSTATUS Status;
|
|
|
|
GrabMutex();
|
|
|
|
Status = GetRelatedStartNodeInstance(pIrp, &pStartNodeInstance);
|
|
if(!NT_SUCCESS(Status)) {
|
|
goto exit;
|
|
}
|
|
Assert(pStartNodeInstance);
|
|
|
|
Status = KsValidateAllocatorCreateRequest(
|
|
pIrp,
|
|
&pAllocatorFraming);
|
|
|
|
if(!NT_SUCCESS(Status)) {
|
|
DPF1(5,
|
|
"AllocatorDispatchCreate: KsValidateAllocatorCreateReq FAILED %08x",
|
|
Status);
|
|
goto exit;
|
|
}
|
|
|
|
// Allocate per allocator instance data
|
|
pInstance = new INSTANCE(
|
|
&pStartNodeInstance->pPinInstance->ParentInstance);
|
|
|
|
if(pInstance == NULL) {
|
|
Trap();
|
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
|
goto exit;
|
|
}
|
|
|
|
Status = pInstance->DispatchCreate(
|
|
pIrp,
|
|
(UTIL_PFN)AllocatorDispatchCreateKP,
|
|
pAllocatorFraming);
|
|
|
|
if(!NT_SUCCESS(Status)) {
|
|
DPF1(5, "AllocatorDispatchCreateKP: FAILED %08x", Status);
|
|
goto exit;
|
|
}
|
|
exit:
|
|
if(!NT_SUCCESS(Status) && (pInstance != NULL)) {
|
|
delete pInstance;
|
|
}
|
|
ReleaseMutex();
|
|
|
|
pIrp->IoStatus.Status = Status;
|
|
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
AllocatorDispatchCreateKP(
|
|
PINSTANCE pInstance,
|
|
PKSALLOCATOR_FRAMING pAllocatorFraming
|
|
)
|
|
{
|
|
PPIN_INSTANCE pPinInstance;
|
|
HANDLE hAllocator = NULL;
|
|
NTSTATUS Status;
|
|
|
|
Assert(pInstance);
|
|
pPinInstance = pInstance->GetParentInstance();
|
|
Assert(pPinInstance);
|
|
Assert(pPinInstance->pStartNodeInstance);
|
|
Assert(pPinInstance->pStartNodeInstance->pPinNodeInstance);
|
|
ASSERT(pPinInstance->pStartNodeInstance->pPinNodeInstance->hPin != NULL);
|
|
|
|
Status = KsCreateAllocator(
|
|
pPinInstance->pStartNodeInstance->pPinNodeInstance->hPin,
|
|
pAllocatorFraming,
|
|
&hAllocator);
|
|
|
|
if(!NT_SUCCESS(Status)) {
|
|
goto exit;
|
|
}
|
|
|
|
Status = pInstance->SetNextFileObject(hAllocator);
|
|
if(!NT_SUCCESS(Status)) {
|
|
Trap();
|
|
goto exit;
|
|
}
|
|
exit:
|
|
if(hAllocator != NULL) {
|
|
ZwClose(hAllocator);
|
|
}
|
|
return(Status);
|
|
}
|