ExpQueryElamCertInfo
NTSTATUS __stdcall ExpQueryElamCertInfo(VOID *ElamHandle){
VOID *v1;
int Section;
UINT64 v3;
_ADAPTER_OBJECT *v4;
_LARGE_INTEGER v5;
VOID *PoolWithQuotaTag;
UINT8 v7;
INT64 v8;
const WCHAR *v9;
VOID **KernelHandle;
POBJECT_HANDLE_INFORMATION HandleInformation;
UINT64 AllocationType;
UINT64 Win32Protect;
PVOID Object;
_LARGE_INTEGER FileSize;
UINT64 ViewSize[3];
_OBJECT_ATTRIBUTES ObjectAttributes;
VOID *BaseAddress;
VOID *SectionHandle;
VOID *Handle;
Handle = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
FileSize.QuadPart = 0i64;
ViewSize[0] = 0i64;
SectionHandle = 0i64;
v1 = 0i64;
BaseAddress = 0i64;
Section = IoConvertFileHandleToKernelHandle(ElamHandle, KeGetCurrentThread()->PreviousMode, 1ui64, 0, &Handle);
if( Section >= 0 )
{
Object = 0i64;
v3 = (UINT64)Handle;
Section = ObReferenceObjectByHandle(Handle, 1ui64, (_OBJECT_TYPE *)IoFileObjectType, 0, &Object, 0i64);
v4 = (_ADAPTER_OBJECT *)Object;
if( Section >= 0 )
{
if( *((_BYTE *)Object + 78) || *((_BYTE *)Object + 75) )
{
Section = -1073741757;
}
else
{
Section = FsRtlGetFileSize((_FILE_OBJECT *)Object, &FileSize);
if( Section >= 0 )
{
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
ObjectAttributes.ObjectName = 0i64;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
LODWORD(HandleInformation) = 0x8000000;
LODWORD(KernelHandle) = 2;
Section = ZwCreateSection(
(UINT64)&SectionHandle,
4ui64,
(INT64)&ObjectAttributes,
0i64,
(INT64)KernelHandle,
(INT64)HandleInformation,
v3);
if( Section >= 0 )
{
v5 = FileSize;
ViewSize[0] = FileSize.QuadPart;
LODWORD(Win32Protect) = 2;
LODWORD(AllocationType) = 0;
Section = ZwMapViewOfSection(
SectionHandle,
(VOID *)0xFFFFFFFFFFFFFFFFi64,
&BaseAddress,
0i64,
0i64,
0i64,
ViewSize,
ViewShare,
AllocationType,
Win32Protect);
if( Section >= 0 )
{
if( qword_140C1D908 )
Section = ((__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))qword_140C1D908)(
0i64,
BaseAddress,
(_LARGE_INTEGER)v5.QuadPart);
else
Section = -1073741637;
if( Section >= 0 )
{
PoolWithQuotaTag = ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v5.QuadPart, 0x4D414C45ui64);
v1 = PoolWithQuotaTag;
ViewSize[2] = (UINT64)PoolWithQuotaTag;
if( PoolWithQuotaTag )
{
memmove(PoolWithQuotaTag, BaseAddress, v5.anonymous_0.LowPart);
if( qword_140C1D908 )
Section = ((__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))qword_140C1D908)(
0i64,
v1,
(_LARGE_INTEGER)v5.QuadPart);
else
Section = -1073741637;
if( Section >= 0 )
{
LOBYTE(v8) = 1;
Section = SeRegisterElamCertResources(v1, v7, v8, v9);
if( Section >= 0 )
Section = 0;
}
}
else
{
Section = -1073741670;
}
}
}
else
{
BaseAddress = 0i64;
}
}
else
{
SectionHandle = 0i64;
}
}
}
}
else
{
v4 = 0i64;
}
}
else
{
v3 = 0i64;
v4 = 0i64;
}
if( v1 )
ExFreePoolWithTag(v1, 0x4D414C45u);
if( BaseAddress )
ZwUnmapViewOfSection((VOID *)0xFFFFFFFFFFFFFFFFi64, BaseAddress);
if( SectionHandle )
ZwClose((_HANDLE)SectionHandle);
if( v4 )
HalPutDmaAdapter(v4);
if( v3 )
ZwClose(v3);
return Section;
}Referenced by:
NtSetSystemInformation