From: Nello De Gregoris <bluechxindv@gmail.com> --- dlls/ntoskrnl.exe/ntoskrnl.c | 25 +++++++++++++++++++++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/ddk/ntifs.h | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 0855749249f..adf5a9bcd3f 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -2460,6 +2460,31 @@ NTSTATUS WINAPI ExInitializeZone(PZONE_HEADER Zone, return STATUS_NOT_IMPLEMENTED; } +/*********************************************************************** + * FsRtlGetFileSize (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI FsRtlGetFileSize( PFILE_OBJECT file_obj, PLARGE_INTEGER file_size ) +{ + FILE_STANDARD_INFORMATION info; + IO_STATUS_BLOCK iosb; + NTSTATUS status; + HANDLE handle; + + TRACE( "file_obj %p, file_size %p\n", file_obj, file_size ); + + status = ObOpenObjectByPointer( file_obj, 0, NULL, 0, IoFileObjectType, KernelMode, &handle ); + if (status) return status; + + status = NtQueryInformationFile( handle, &iosb, &info, sizeof(info), FileStandardInformation ); + NtClose( handle ); + if (!status) + { + if (info.Directory) return STATUS_FILE_IS_A_DIRECTORY; + file_size->QuadPart = info.EndOfFile.QuadPart; + } + return status; +} + /*********************************************************************** * FsRtlIsNameInExpression (NTOSKRNL.EXE.@) */ diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index f4699c6c65a..17c74b9322e 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -237,7 +237,7 @@ @ stub FsRtlFastUnlockSingle @ stub FsRtlFindInTunnelCache @ stub FsRtlFreeFileLock -@ stub FsRtlGetFileSize +@ stdcall FsRtlGetFileSize(ptr ptr) @ stub FsRtlGetNextFileLock @ stub FsRtlGetNextLargeMcbEntry @ stub FsRtlGetNextMcbEntry diff --git a/include/ddk/ntifs.h b/include/ddk/ntifs.h index 980235abdc9..965715738d7 100644 --- a/include/ddk/ntifs.h +++ b/include/ddk/ntifs.h @@ -203,6 +203,7 @@ typedef struct _REPARSE_GUID_DATA_BUFFER #define COMPRESSION_FORMAT_MASK 0x00ff #define COMPRESSION_ENGINE_MASK 0xff00 +NTSTATUS WINAPI FsRtlGetFileSize(PFILE_OBJECT, PLARGE_INTEGER); BOOLEAN WINAPI FsRtlIsNameInExpression(PUNICODE_STRING, PUNICODE_STRING, BOOLEAN, PWCH); DEVICE_OBJECT * WINAPI IoGetAttachedDevice(DEVICE_OBJECT*); PEPROCESS WINAPI IoGetRequestorProcess(IRP*); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10247