PopBcdRegenerateResumeObject
NTSTATUS __stdcall PopBcdRegenerateResumeObject(
VOID *StoreHandle,
VOID *LoaderObjectHandle,
VOID **ResumeObjectHandleOut){
PVOID v3;
int Element;
VOID *v7;
VOID *v8;
NTSTATUS v9;
_UNICODE_STRING *v10;
const WCHAR *v11;
VOID *v12;
VOID *v13;
UINT64 DataSize;
UINT64 DataSizea;
UINT64 DataSizeb;
__int128 BufferSizeOut;
VOID *ObjectHandle;
PVOID P;
_BCD_OBJECT_DESCRIPTION Description;
GUID v22;
_GUID Identifier;
LODWORD(BufferSizeOut) = 0;
v3 = 0i64;
memset((char *)&BufferSizeOut + 4, 0, 12);
ObjectHandle = 0i64;
P = 0i64;
Description.Version = 1;
Description.Type = 270532612;
Identifier = 0i64;
v22 = 0i64;
Element = BcdCreateObject(StoreHandle, 0i64, &Description, &ObjectHandle);
if( Element < 0 )
{
v7 = ObjectHandle;
}
else
{
Element = PopBcdReadElement(
LoaderObjectHandle,
0x12000004ui64,
(VOID **)&BufferSizeOut + 1,
(UINT64 *)&BufferSizeOut);
if( Element < 0 )
{
v7 = ObjectHandle;
}
else
{
PopBcdReadElement(LoaderObjectHandle, 0x12000005ui64, &P, (UINT64 *)((char *)&BufferSizeOut + 4));
v7 = ObjectHandle;
LODWORD(DataSize) = BufferSizeOut;
v9 = BcdSetElementDataWithFlags(ObjectHandle, 0x12000004ui64, v8, *((VOID **)&BufferSizeOut + 1), DataSize);
v3 = P;
Element = v9;
if( v9 >= 0 )
{
if( !P
|| (LODWORD(DataSizea) = DWORD1(BufferSizeOut),
Element = BcdSetElementDataWithFlags(v7, 0x12000005ui64, v10, P, DataSizea),
Element >= 0) )
{
Element = PopBcdSetDefaultResumeObjectElements(v7, LoaderObjectHandle, v10, v11);
if( Element >= 0 )
{
LODWORD(DataSizea) = 16;
v22 = GUID_RESUME_LOADER_SETTINGS_GROUP;
Element = BcdSetElementDataWithFlags(v7, 0x14000006ui64, v12, &v22, DataSizea);
if( Element >= 0 )
{
Element = BcdQueryObject(v7, 0i64, 0i64, &Identifier);
if( Element >= 0 )
{
LODWORD(DataSizeb) = 16;
Element = BcdSetElementDataWithFlags(LoaderObjectHandle, 0x23000003ui64, v13, &Identifier, DataSizeb);
if( Element >= 0 )
{
*ResumeObjectHandleOut = v7;
v7 = 0i64;
}
}
}
}
}
}
}
if( *((_QWORD *)&BufferSizeOut + 1) )
ExFreePoolWithTag(*((PVOID *)&BufferSizeOut + 1), 0);
if( v3 )
ExFreePoolWithTag(v3, 0);
}
if( v7 )
{
if( Element < 0 )
BcdDeleteObject(v7);
else
BcdCloseObject(v7);
}
return Element;
}Referenced by:
PopBcdEstablishResumeObject