PiOpenDirectoryWithRoot
INT64 __stdcall PiOpenDirectoryWithRoot(PCUNICODE_STRING SourceString, PCUNICODE_STRING a2){
char v2;
_QWORD *v3;
CHAR *v4;
_QWORD *v5;
char v6;
int DirectoryPath;
NTSTATUS v10;
int StateDirectorySecurityObject;
__int64 v12;
CHAR *v14;
struct _IO_STATUS_BLOCK IoStatusBlock;
struct _OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING FileHandle;
*(_QWORD *)&FileHandle.Length = 0i64;
v4 = 0i64;
v14 = 0i64;
v5 = v3;
v6 = v2;
IoStatusBlock = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
if( !SourceString || !a2 || !v3 )
{
DirectoryPath = -1073741811;
goto LABEL_15;
}
if( !(unsigned __int8)RtlPrefixUnicodeString((PVOID)SourceString, (INT64 *)a2) )
return(unsigned int)-1073741811;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 576;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)a2;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v10 = ZwOpenFile(&FileHandle, (PWCHAR)0x100001);
DirectoryPath = v10;
if( v10 == -1073741766 )
{
if( !v6 )
goto LABEL_15;
StateDirectorySecurityObject = PiAuGetStateDirectorySecurityObject(&v14);
v4 = v14;
DirectoryPath = StateDirectorySecurityObject;
if( StateDirectorySecurityObject < 0 )
goto LABEL_15;
DirectoryPath = PiCreateDirectoryPath(SourceString);
if( DirectoryPath < 0 )
goto LABEL_15;
DirectoryPath = PiCreateDirectoryPath(a2);
if( DirectoryPath < 0 )
goto LABEL_15;
goto LABEL_13;
}
if( v10 >= 0 )
{
LABEL_13:
v12 = *(_QWORD *)&FileHandle.Length;
*(_QWORD *)&FileHandle.Length = 0i64;
*v5 = v12;
}
LABEL_15:
if( *(_QWORD *)&FileHandle.Length )
ZwClose(*(HANDLE *)&FileHandle.Length);
if( v4 )
ExFreePoolWithTag(v4, 0);
return(unsigned int)DirectoryPath;
}Referenced by:
PiBuildAndOpenDeviceDirectoryPath
PiGetDriverMutableStateDirectory