SmKmStoreFileCreateForIoType
NTSTATUS __stdcall SmKmStoreFileCreateForIoType(
_SMKM_FILE_INFO *FileInfo,
WCHAR *FilePath,
UINT64 *PerformsFileIo,
UINT64 CreateDisposition,
UINT64 CreateOptions){
_BOOL8 v8;
int v9;
char v10;
char v11;
int IsVolumeIoPossible;
_OBJECT_ATTRIBUTES *v13;
_IO_STATUS_BLOCK *v14;
INT16 v15;
__int128 v17;
__int128 v18;
__int128 v19;
_LARGE_INTEGER *AllocationSize;
UINT64 FileAttributes;
UINT64 FileAttributesa;
UINT64 ShareAccess;
UINT64 ShareAccessa;
UINT64 Disposition;
UINT64 Dispositiona;
UINT64 v27;
UINT64 v28;
PVOID EaBuffer;
UINT64 EaLength;
UINT64 EaLengtha;
_CREATE_FILE_TYPE CreateFileType;
PVOID InternalParameters;
UINT64 Options;
UINT64 Optionsa;
_ACL *DaclOut;
void *FileHandle[8];
_OBJECT_ATTRIBUTES ObjectAttributes;
_UNICODE_STRING DestinationString;
_IO_STATUS_BLOCK IoStatusBlock;
_SECURITY_DESCRIPTOR SecurityDescriptor;
PVOID Object;
UINT64 DesiredAccess;
LODWORD(DesiredAccess) = 0;
LODWORD(CreateOptions) = 0;
LODWORD(v8) = 0;
DestinationString = 0i64;
IoStatusBlock = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
memset(&SecurityDescriptor, 0, sizeof(SecurityDescriptor));
memset(FileHandle, 0i64, sizeof(FileHandle));
DaclOut = 0i64;
if( PerformsFileIo )
{
v9 = 0;
}
else
{
v9 = 1;
PerformsFileIo = &CreateOptions;
}
IoSetThreadHardErrorMode(0);
v11 = v10;
RtlInitUnicodeString(&DestinationString, FilePath);
IsVolumeIoPossible = SmKmStoreFileMakeSecurityDescriptor(&SecurityDescriptor, &DaclOut);
if( IsVolumeIoPossible >= 0 )
{
ObjectAttributes.Length = 48;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.SecurityDescriptor = &SecurityDescriptor;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
ObjectAttributes.SecurityQualityOfService = 0i64;
while( 1 )
{
LODWORD(Options) = *(_DWORD *)PerformsFileIo != 0 ? 264 : 266;
LODWORD(EaLength) = 0;
LODWORD(v27) = 32778;
LODWORD(Disposition) = 0;
LODWORD(ShareAccess) = 0;
LODWORD(FileAttributes) = 0x2000;
IsVolumeIoPossible = IoCreateFile(
FileHandle,
0x140003ui64,
&ObjectAttributes,
&IoStatusBlock,
0i64,
FileAttributes,
ShareAccess,
Disposition,
v27,
0i64,
EaLength,
CreateFileTypeNone,
0i64,
Options);
if( IsVolumeIoPossible < 0 )
break;
Object = 0i64;
IsVolumeIoPossible = ObReferenceObjectByHandle(FileHandle[0], 0x10003ui64, 0i64, 0, &Object, 0i64);
FileHandle[1] = Object;
if( IsVolumeIoPossible < 0 )
break;
if( *(_DWORD *)PerformsFileIo )
v8 = (IoStatusBlock.Information & 0xFFFFFFFFFFFFFFFDui64) == 0;
else
LODWORD(v8) = 1;
IsVolumeIoPossible = ZwSetSecurityObject((UINT64)FileHandle[0], 4ui64, (INT64)&SecurityDescriptor);
if( IsVolumeIoPossible < 0 )
break;
if( *(_DWORD *)PerformsFileIo )
goto LABEL_25;
IsVolumeIoPossible = SmKmIsVolumeIoPossible(
FileHandle,
(UINT64)&DesiredAccess,
v13,
v14,
AllocationSize,
FileAttributesa,
ShareAccessa,
Dispositiona,
v28,
EaBuffer,
EaLengtha,
CreateFileType,
InternalParameters,
Optionsa);
if( IsVolumeIoPossible < 0 )
break;
if( (_DWORD)DesiredAccess )
{
LABEL_25:
v17 = *(_OWORD *)&FileHandle[2];
*(_OWORD *)FileInfo = *(_OWORD *)FileHandle;
v18 = *(_OWORD *)&FileHandle[4];
*((_OWORD *)FileInfo + 1) = v17;
v19 = *(_OWORD *)&FileHandle[6];
*((_OWORD *)FileInfo + 2) = v18;
*((_OWORD *)FileInfo + 3) = v19;
memset(FileHandle, 0i64, sizeof(FileHandle));
IsVolumeIoPossible = 0;
goto LABEL_22;
}
if( v9 )
{
IsVolumeIoPossible = -1073741637;
break;
}
*(_DWORD *)PerformsFileIo = 1;
if( v8 )
SmKmStoreFileDelete((_SMKM_FILE_INFO *)FileHandle);
SmKmFileInfoCleanup((_SMKM_FILE_INFO *)FileHandle);
memset(FileHandle, 0i64, sizeof(FileHandle));
LODWORD(v8) = 0;
}
if( v8 )
SmKmStoreFileDelete((_SMKM_FILE_INFO *)FileHandle);
}
LABEL_22:
SmKmFileInfoCleanup((_SMKM_FILE_INFO *)FileHandle);
HIBYTE(v15) = BYTE1(DaclOut);
if( DaclOut )
ExFreePoolWithTag(DaclOut, 0);
LOBYTE(v15) = v11;
IoSetThreadHardErrorMode(v15);
return IsVolumeIoPossible;
}Referenced by:
SmKmStoreFileCreate