From 7715328fc54b2ab5bbf78063246c185897464400 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Sun, 8 Feb 2004 10:42:15 +0000 Subject: [PATCH] CreateFileMappingA/CreateFileMappingW: a NULL size argument for this function should result in the filesize being used. Patch by Gero Kuehn (gero.kuehn@gkware.com). svn path=/trunk/; revision=8088 --- reactos/lib/kernel32/mem/section.c | 44 +++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/reactos/lib/kernel32/mem/section.c b/reactos/lib/kernel32/mem/section.c index f8c2bba1a9b..fcc397a4939 100644 --- a/reactos/lib/kernel32/mem/section.c +++ b/reactos/lib/kernel32/mem/section.c @@ -1,4 +1,4 @@ -/* $Id: section.c,v 1.23 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: section.c,v 1.24 2004/02/08 10:42:15 jfilby Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,6 +37,8 @@ CreateFileMappingA(HANDLE hFile, ANSI_STRING AnsiName; UNICODE_STRING UnicodeName; PSECURITY_DESCRIPTOR SecurityDescriptor; + IO_STATUS_BLOCK IoStatusBlock; + FILE_STANDARD_INFORMATION FileStandard; if ((flProtect & (MASK_PAGE_FLAGS | MASK_SEC_FLAGS)) != flProtect) { @@ -53,8 +55,26 @@ CreateFileMappingA(HANDLE hFile, SecurityDescriptor = NULL; } - MaximumSize.u.LowPart = dwMaximumSizeLow; - MaximumSize.u.HighPart = dwMaximumSizeHigh; + if((dwMaximumSizeLow==0)&&(dwMaximumSizeHigh==0)) + { + // MSDN: If dwMaximumSizeLow and dwMaximumSizeHigh are zero, the maximum size of the + // file-mapping object is equal to the current size of the file identified by hFile. + Status = NtQueryInformationFile(hFile, + &IoStatusBlock, + &FileStandard, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation); + if (!NT_SUCCESS(Status)) + { + DPRINT("Status 0x%08x obtaining FileStandardInformation for source\n", errCode); + SetLastErrorByStatus(Status); + return NULL; + } + MaximumSize = FileStandard.EndOfFile; + } else { + MaximumSize.u.LowPart = dwMaximumSizeLow; + MaximumSize.u.HighPart = dwMaximumSizeHigh; + } RtlInitAnsiString(&AnsiName, (LPSTR)lpName); RtlAnsiStringToUnicodeString(&UnicodeName, @@ -100,6 +120,8 @@ CreateFileMappingW(HANDLE hFile, OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING UnicodeName; PSECURITY_DESCRIPTOR SecurityDescriptor; + IO_STATUS_BLOCK IoStatusBlock; + FILE_STANDARD_INFORMATION FileStandard; if ((flProtect & (MASK_PAGE_FLAGS | MASK_SEC_FLAGS)) != flProtect) { @@ -118,7 +140,21 @@ CreateFileMappingW(HANDLE hFile, if ((dwMaximumSizeLow == 0) && (dwMaximumSizeHigh == 0)) { - MaximumSizePointer = NULL; + // MSDN: If dwMaximumSizeLow and dwMaximumSizeHigh are zero, the maximum size of the + // file-mapping object is equal to the current size of the file identified by hFile. + Status = NtQueryInformationFile(hFile, + &IoStatusBlock, + &FileStandard, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation); + if (!NT_SUCCESS(Status)) + { + DPRINT("Status 0x%08x obtaining FileStandardInformation for source\n", errCode); + SetLastErrorByStatus(Status); + return NULL; + } + MaximumSize = FileStandard.EndOfFile; + MaximumSizePointer = &MaximumSize; } else {