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.