IoSetDevicePropertyData

NTSTATUS __stdcall IoSetDevicePropertyData(
        _DEVICE_OBJECT *Pdo,
        _DEVPROPKEY *PropertyKey,
        UINT64 Lcid,
        UINT64 Flags,
        UINT64 Type,
        UINT64 Size,
        VOID *Data){
  _DWORD *DeviceNode; 
  _DRIVER_OBJECT *DriverObject; 
  _UNICODE_STRING *p_DriverName; 
  VOID **v12; 
  VOID **v13; 
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _WORD *v15; 
  __int64 v16; 
  _WORD *v17; 
  __int64 v18; 

  if( !Pdo )
    goto LABEL_16;
  DeviceNode = Pdo->DeviceObjectExtension->DeviceNode;
  if( !DeviceNode || (DeviceNode[99] & 0x20000) != 0 )
  {
    IoAddTriageDumpDataBlock(Pdo, (_BYTE *)Pdo->Size);
    DriverObject = Pdo->DriverObject;
    if( DriverObject )
    {
      IoAddTriageDumpDataBlock(DriverObject, (_BYTE *)(unsigned int)DriverObject->Size);
      p_DriverName = &Pdo->DriverObject->DriverName;
      if( p_DriverName->Length )
      {
        IoAddTriageDumpDataBlock(p_DriverName, (_BYTE *)2);
        IoAddTriageDumpDataBlock(Pdo->DriverObject->DriverName.Buffer, (_BYTE *)Pdo->DriverObject->DriverName.Length);
      }
    }
    v12 = (VOID **)Pdo->DeviceObjectExtension->DeviceNode;
    if( v12 )
    {
      v13 = v12 + 5;
      IoAddTriageDumpDataBlock(v12, (_BYTE *)0x310);
      if( *(_WORD *)v13 )
      {
        IoAddTriageDumpDataBlock(v13, (_BYTE *)2);
        IoAddTriageDumpDataBlock(v13[1], (_BYTE *)*(unsigned __int16 *)v13);
      }
      DeviceObjectExtension = Pdo->DeviceObjectExtension;
      v15 = (char *)DeviceObjectExtension->DeviceNode + 56;
      if( *v15 )
      {
        IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *((VOID **)Pdo->DeviceObjectExtension->DeviceNode + 8),
          (_BYTE *)*((unsigned __int16 *)Pdo->DeviceObjectExtension->DeviceNode + 28));
        DeviceObjectExtension = Pdo->DeviceObjectExtension;
      }
      v16 = *((_QWORD *)DeviceObjectExtension->DeviceNode + 2);
      if( v16 )
      {
        v17 = (_WORD *)(v16 + 56);
        if( *v17 )
        {
          IoAddTriageDumpDataBlock(v17, (_BYTE *)2);
          v18 = *((_QWORD *)Pdo->DeviceObjectExtension->DeviceNode + 2);
          IoAddTriageDumpDataBlock(*(VOID **)(v18 + 64), (_BYTE *)*(unsigned __int16 *)(v18 + 56));
        }
      }
    }
LABEL_16:
    KeBugCheckEx(0xCAu, (PVOID)2, Pdo, 0i64, 0i64);
  }
  return PnpSetDevicePropertyData(
           (__int64)Pdo,
           (UINT64)PropertyKey,
           Lcid,
           (unsigned int)Lcid,
           Data != 0i64 ? Type : 0,
           Data != 0i64 ? Size : 0,
           Data);
}

Referenced by:

HalpInterruptConnect