PiPnpRtlObjectEventCreate
INT64 __fastcall PiPnpRtlObjectEventCreate(WCHAR *a1, INT64 a2, INT64 a3, CHAR **a4){
unsigned int v4;
CHAR *v8;
NTSTATUS v9;
_CM_KEY_CONTROL_BLOCK **v10;
_CM_KEY_CONTROL_BLOCK *v11;
int Object;
UINT *v14;
VOID *v15;
VOID **v16;
void *PoolWithTag;
_DWORD *v18;
PVOID v19;
UINT64 inserted;
_POOL_TYPE v21;
_GENERIC_MAPPING *v22;
_CM_TRANS *SearchResult;
PVOID v24;
PVOID P;
PVOID NodeOrParent;
INT64 *Buffer;
INT64 v28[10];
INT64 result[14];
v4 = a2;
memset((INT64)result, 0i64);
memset((INT64)v28, 0i64);
NodeOrParent = 0i64;
LODWORD(SearchResult) = 0;
v8 = 0i64;
Buffer = v28;
*a4 = 0i64;
v24 = 0i64;
v9 = PiDmInitializeComparisonObject(a1, v4, (INT64)result);
if( v9 >= 0 )
{
v28[1] = (INT64)result;
LODWORD(v10) = RtlLookupElementGenericTableFullAvl(
(RTL_AVL_TABLE *)(a3 + 24),
&Buffer,
&NodeOrParent,
(TABLE_SEARCH_RESULT *)&SearchResult);
if( v10 )
v11 = *v10;
else
v11 = 0i64;
if( v11 )
goto LABEL_5;
Object = PiDmGetObject(v4, a1, (INT64 *)&v24);
v9 = Object;
if( Object == -1073741772 )
{
v8 = (CHAR *)v24;
v9 = 0;
goto LABEL_14;
}
if( Object < 0 )
{
v8 = (CHAR *)v24;
LABEL_18:
if( v11 )
PiPnpRtlObjectEventRelease(v11, v14, v15, v16, v21, v22, SearchResult, (_CM_KCB_UOW *)v24);
goto LABEL_20;
}
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0xF0ui64, 0x41706E50ui64);
P = PoolWithTag;
v18 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
v19 = v24;
*v18 = 1;
v18[18] = 5;
v8 = 0i64;
*((_QWORD *)v18 + 1) = v19;
LODWORD(v22) = (_DWORD)SearchResult;
v21 = (int)NodeOrParent;
inserted = RtlInsertElementGenericTableFullAvl((RTL_BITMAP *)(a3 + 24), (UINT64)&P, 8ui64);
v11 = (_CM_KEY_CONTROL_BLOCK *)P;
if( inserted )
{
LABEL_5:
*a4 = (CHAR *)v11;
return(unsigned int)v9;
}
v9 = -1073741670;
goto LABEL_18;
}
v8 = (CHAR *)v24;
v9 = -1073741670;
}
LABEL_20:
*a4 = 0i64;
LABEL_14:
if( v8 )
PiDmObjectRelease(v8);
return(unsigned int)v9;
}Referenced by:
PiPnpRtlCacheObjectBaseKey
PiPnpRtlEnsureObjectCached
PiPnpRtlObjectEventWorker