PnpSetDevicePropertyData
NTSTATUS __stdcall PnpSetDevicePropertyData(
DEVICE_OBJECT *Pdo,
DEVPROPKEY *PropertyKey,
UINT64 Lcid,
UINT64 Type,
UINT64 Size,
PVOID Data){
unsigned int v6;
__int64 v9;
_ETHREAD *CurrentThread;
NTSTATUS v11;
__int64 v13;
NTSTATUS v14;
INT64 v15;
UINT64 v16;
UINT64 v17;
_UNICODE_STRING String;
INT64 result[22];
WCHAR *a2;
v6 = Lcid;
memset((INT64)result, 0i64);
*(_QWORD *)&String.Length = 0i64;
if( Pdo )
v9 = *(_QWORD *)(*((_QWORD *)Pdo + 39) + 40i64);
else
v9 = 0i64;
if( !v9 || !*(_QWORD *)(v9 + 48) )
return -1073741808;
if( v6 )
{
String.MaximumLength = 170;
String.Buffer = (wchar_t *)result;
if( !RtlLCIDToCultureName(v6, &String) )
return -1073741823;
}
else
{
String.Buffer = 0i64;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&PnpDevicePropertyLock, 1u);
LODWORD(v17) = 0;
LODWORD(v16) = (_DWORD)Data;
LODWORD(v15) = Size;
v11 = PiPnpRtlSetObjectProperty(
PiPnpRtlCtx,
*(WCHAR **)(v9 + 48),
1ui64,
0i64,
(INT64)String.Buffer,
(INT64)PropertyKey,
v15,
a2,
v16,
v17);
if( v11 >= 0 && PropertyKey->pid == 2 )
{
v13 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *(_QWORD *)&INTERRUPT_CONNECTION_DATA_PKEY.fmtid.Data1;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *(_QWORD *)&INTERRUPT_CONNECTION_DATA_PKEY.fmtid.Data1 )
v13 = *(_QWORD *)PropertyKey->fmtid.Data4 - *(_QWORD *)INTERRUPT_CONNECTION_DATA_PKEY.fmtid.Data4;
if( !v13 )
{
LOBYTE(v14) = PnpSetInterruptInformation((UINT16 *)Pdo, (INT64)a2, (EVENT_DESCRIPTOR *)(unsigned int)Data);
v11 = v14;
}
}
ExReleaseResourceLite(&PnpDevicePropertyLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v11 == -1073741275 )
v11 = -1073741772;
if( *(int *)(v9 + 300) >= 771 )
PnpSetDeviceInstancePropertyChangeEvent(v9);
return v11;
}Referenced by:
IoSetDevicePropertyData