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.