NtEnumerateDriverEntries
NTSTATUS __stdcall NtEnumerateDriverEntries(PVOID Buffer, UINT64 *a2){
UINT64 *v2;
unsigned int *v4;
NTSTATUS result;
INT8 v6;
__int64 v7;
unsigned int v8;
INT64 v9;
NTSTATUS v10;
_DWORD *v11;
_ETHREAD *v12;
int v13;
unsigned int *PoolWithTag;
unsigned int *v15;
__int64 v16;
WCHAR *v17;
unsigned int v18;
__int64 v19;
unsigned int v20;
unsigned int v21;
unsigned __int64 v22;
unsigned int v23;
BOOL v24;
unsigned int v25;
BOOL v26;
BOOL v27;
unsigned int v28;
unsigned int v29;
__int64 v30;
UINT64 v31;
__int64 v32;
VOID **LockedBuffer;
VOID **LockedBuffera;
BOOL v35;
UINT64 Id;
unsigned int v37;
unsigned int v38;
NTSTATUS v39;
unsigned int v40;
UINT64 Attributes;
PVOID P;
PVOID Max;
size_t Size;
void *Src;
UINT8 *v46;
_ETHREAD *CurrentThread;
SIZE_T NumberOfBytes;
v2 = a2;
Attributes = 0i64;
P = 0i64;
v4 = 0i64;
if( dword_140C19650 != 2 )
return -1073741822;
if( (PVOID)((unsigned __int64)Buffer & 0xFFFFFFFFFFFFFFFCui64) != Buffer )
return -1073741811;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = *((_BYTE *)CurrentThread + 562);
if( v6 )
{
v7 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)a2 < 0x7FFFFFFF0000i64 )
v7 = (__int64)a2;
*(_DWORD *)v7 = *(_DWORD *)v7;
v8 = Buffer != 0i64 ? *(_DWORD *)a2 : 0;
if( v8 )
ProbeForWrite(Buffer, v8, 4ui64);
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, v6) )
return -1073741727;
}
else
{
v8 = Buffer != 0i64 ? *(_DWORD *)a2 : 0;
}
if( !v8 || (result = ExLockUserBuffer(Buffer, v8, v6, IoWriteAccess, (VOID **)&Attributes, &P), result >= 0) )
{
v9 = Attributes;
v10 = 0;
v35 = v8 != 0;
v11 = 0i64;
v12 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v12 + 242);
ExAcquireFastMutexUnsafe(&ExpEnvironmentLock);
LODWORD(NumberOfBytes) = 0;
v13 = IoEnumerateEnvironmentVariablesEx(
(WCHAR *)2,
(GUID *)ExpIsDriverEntry,
0i64,
&NumberOfBytes,
(UINT64 *)LockedBuffer);
if( v13 == -1073741789 )
{
PoolWithTag = (unsigned int *)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)NumberOfBytes, 0x72766E45ui64);
v4 = PoolWithTag;
if( PoolWithTag )
v13 = IoEnumerateEnvironmentVariablesEx(
(WCHAR *)2,
(GUID *)ExpIsDriverEntry,
PoolWithTag,
&NumberOfBytes,
(UINT64 *)LockedBuffera);
else
v13 = -1073741670;
}
else
{
LODWORD(NumberOfBytes) = 0;
}
ExReleaseFastMutexUnsafe(&ExpEnvironmentLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v13 || !(_DWORD)NumberOfBytes )
goto LABEL_53;
v15 = v4;
Max = (char *)v4 + 2 * (unsigned int)NumberOfBytes;
while( 1 )
{
LODWORD(Id) = 0;
v16 = *((_QWORD *)v15 + 2) - *(_QWORD *)&EfiDriverVariablesGuid.Data1;
if( !v16 )
v16 = *((_QWORD *)v15 + 3) - *(_QWORD *)EfiDriverVariablesGuid.Data4;
if( !v16 && (unsigned int)ExpTranslateDriverEntryNameToId((PWCHAR)v15 + 16, &Id) && v15[2] >= 8 )
{
v17 = (WCHAR *)((char *)v15 + v15[1]);
v38 = v17[2];
Src = v17 + 3;
v18 = ExpSafeWcslen(v17 + 3, Max);
if( v18 != -1 )
v18 = 2 * v18 + 2;
if( v18 != -1 && v21 < v20 && v20 >= v21 + v18 + 6 )
break;
}
LABEL_49:
v32 = *v15;
if( !(_DWORD)v32 )
{
v2 = a2;
if( v11 )
*v11 = 0;
LABEL_53:
if( v4 )
ExFreePoolWithTag(v4, 0);
if( P )
ExUnlockUserBuffer(P);
if( v13 < 0 )
v10 = v13;
*(_DWORD *)v2 = v9 - Attributes;
return v10;
}
v15 = (unsigned int *)((char *)v15 + v32);
}
Size = v18;
v46 = (UINT8 *)(v19 + v18 + 6i64);
v22 = (v9 + 3) & 0xFFFFFFFFFFFFFFFCui64;
if( v22 != v9 )
{
v23 = v22 - v9;
v9 = (v9 + 3) & 0xFFFFFFFFFFFFFFFCui64;
if( v8 < v23 )
{
v24 = 0;
v8 = 0;
v10 = -1073741789;
LABEL_38:
HIDWORD(Id) = (v18 + 23) & 0xFFFFFFFC;
v37 = v21 + HIDWORD(Id) + 12;
v25 = v37 + 4;
v40 = v37 + 4;
if( v8 < v37 + 4 )
v10 = -1073741789;
v39 = v10;
v26 = 0;
if( v8 >= v25 )
v26 = v24;
v27 = v26;
v35 = v26;
v28 = v8;
v29 = v8 - v25;
v8 = 0;
if( v28 >= v25 )
v8 = v29;
if( v27 )
{
memset(v9, 0i64);
*(_DWORD *)(v9 + 4) = 1;
*(_DWORD *)(v9 + 8) = v37;
*(_DWORD *)(v9 + 12) = Id;
*(_DWORD *)(v9 + 16) = 20;
*(_DWORD *)(v9 + 20) = HIDWORD(Id);
memmove((UINT8 *)(v9 + 24), (UINT8 *)Src, Size);
v30 = v9 + 4 + HIDWORD(Id);
*(_DWORD *)v30 = 1;
v31 = v38;
*(_DWORD *)(v30 + 4) = v38 + 12;
*(_DWORD *)(v30 + 8) = 4;
memmove((UINT8 *)(v30 + 12), v46, v31);
if( v11 )
*v11 = v9 - (_DWORD)v11;
v11 = (_DWORD *)v9;
v10 = v39;
v25 = v40;
}
v9 += v25;
goto LABEL_49;
}
v8 -= v23;
}
v24 = v35;
goto LABEL_38;
}
return result;
}Referenced by:
No references.