IoAllocateDriverObjectExtension
NTSTATUS __stdcall IoAllocateDriverObjectExtension(
_DRIVER_OBJECT *DriverObject,
VOID *ClientIdentificationAddress,
UINT64 DriverObjectExtensionSize,
VOID **DriverObjectExtension){
char v4;
int v8;
VOID **PoolWithTag;
_IO_CLIENT_EXTENSION *v10;
INT64 v11;
INT64 v12;
UINT8 v13;
_IO_CLIENT_EXTENSION *ClientDriverExtension;
_IO_CLIENT_EXTENSION *v15;
*DriverObjectExtension = 0i64;
v4 = 0;
if( (unsigned int)DriverObjectExtensionSize > 0xFFFFFFEF )
return -1073741670;
v8 = DriverObjectExtensionSize;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)DriverObjectExtensionSize + 16i64, 1986622020i64);
v10 = (_IO_CLIENT_EXTENSION *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v8 + 16);
v10->ClientIdentificationAddress = ClientIdentificationAddress;
v13 = KeAcquireQueuedSpinLock(10i64, v11, v12);
ClientDriverExtension = DriverObject->DriverExtension->ClientDriverExtension;
v15 = ClientDriverExtension;
if( !ClientDriverExtension )
goto LABEL_4;
do
{
if( v15->ClientIdentificationAddress == ClientIdentificationAddress )
break;
v15 = v15->NextExtension;
}
while( v15 );
if( !v15 )
{
LABEL_4:
v10->NextExtension = ClientDriverExtension;
v4 = 1;
DriverObject->DriverExtension->ClientDriverExtension = v10;
}
KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v13);
if( v4 )
{
*DriverObjectExtension = &v10[1];
return 0;
}
else
{
ExFreePoolWithTag(v10, 0);
return -1073741771;
}
}Referenced by:
No references.