IoAllocateDriverObjectExtension
NTSTATUS __stdcall IoAllocateDriverObjectExtension(
_DRIVER_OBJECT *DriverObject,
PVOID ClientIdentificationAddress,
UINT64 DriverObjectExtensionSize,
PVOID *DriverObjectExtension){
char v4;
_IO_CLIENT_EXTENSION *PoolWithTag;
_IO_CLIENT_EXTENSION *v9;
KIRQL v10;
_IO_CLIENT_EXTENSION *ClientDriverExtension;
_IO_CLIENT_EXTENSION *v12;
*DriverObjectExtension = 0i64;
v4 = 0;
if( (unsigned int)DriverObjectExtensionSize > 0xFFFFFFEF )
return -1073741670;
PoolWithTag = (_IO_CLIENT_EXTENSION *)ExAllocatePoolWithTag(
NonPagedPoolNx,
(unsigned int)DriverObjectExtensionSize + 16i64,
0x76697244ui64);
v9 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset((INT64)PoolWithTag, 0i64);
v9->ClientIdentificationAddress = ClientIdentificationAddress;
v10 = KeAcquireQueuedSpinLock(0xAui64);
ClientDriverExtension = DriverObject->DriverExtension->ClientDriverExtension;
v12 = ClientDriverExtension;
if( !ClientDriverExtension )
goto LABEL_4;
do
{
if( v12->ClientIdentificationAddress == ClientIdentificationAddress )
break;
v12 = v12->NextExtension;
}
while( v12 );
if( !v12 )
{
LABEL_4:
v9->NextExtension = ClientDriverExtension;
v4 = 1;
DriverObject->DriverExtension->ClientDriverExtension = v9;
}
KeReleaseQueuedSpinLock(0xAui64, v10);
if( v4 )
{
*DriverObjectExtension = &v9[1];
return 0;
}
else
{
ExFreePoolWithTag(v9, 0);
return -1073741771;
}
}Referenced by:
No references.