From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id C1F5121102DA1 for ; Mon, 27 Aug 2018 00:52:51 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Aug 2018 00:52:51 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,294,1531810800"; d="scan'208";a="86641643" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.8]) by orsmga002.jf.intel.com with ESMTP; 27 Aug 2018 00:52:50 -0700 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Hao Wu , Andrew Fish Date: Mon, 27 Aug 2018 15:53:25 +0800 Message-Id: <20180827075330.269224-6-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.16.1.windows.1 In-Reply-To: <20180827075330.269224-1-ruiyu.ni@intel.com> References: <20180827075330.269224-1-ruiyu.ni@intel.com> Subject: [PATCH 05/10] EmulatorPkg/Win: Do not zero out file content X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Aug 2018 07:52:52 -0000 The patch changes the behavior to not zero out file content when the file size is not multiple of block size. Instead, it just provides access to the contents that are multiple of block size and leaves the remaining content (less than block size) untouched. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni Cc: Hao Wu Cc: Andrew Fish --- EmulatorPkg/Win/Host/WinBlockIo.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinBlockIo.c b/EmulatorPkg/Win/Host/WinBlockIo.c index 14491a6e90..7df7d42c7c 100644 --- a/EmulatorPkg/Win/Host/WinBlockIo.c +++ b/EmulatorPkg/Win/Host/WinBlockIo.c @@ -90,6 +90,7 @@ WinNtBlockIoOpenDevice ( { EFI_STATUS Status; UINT64 FileSize; + UINT64 EndOfFile; // // If the device is already opened, close it @@ -112,7 +113,7 @@ WinNtBlockIoOpenDevice ( ); if (Private->NtHandle == INVALID_HANDLE_VALUE) { - DEBUG ((EFI_D_INFO, "OpenBlock: Could not open %S, %x\n", Private->FileName, GetLastError ())); + DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %S, %x\n", Private->FileName, GetLastError ())); Media->MediaPresent = FALSE; Status = EFI_NO_MEDIA; goto Done; @@ -124,14 +125,35 @@ WinNtBlockIoOpenDevice ( Status = SetFilePointer64 (Private, 0, &FileSize, FILE_END); if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "OpenBlock: Could not get filesize of %s\n", Private->FileName)); + DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %s\n", Private->FileName)); Status = EFI_UNSUPPORTED; goto Done; } Media->LastBlock = DivU64x32 (FileSize, (UINT32)Private->BlockSize) - 1; - DEBUG ((EFI_D_INIT, "OpenBlock: opened %S\n", Private->FileName)); + EndOfFile = MultU64x32 (Media->LastBlock + 1, (UINT32)Private->BlockSize); + + if (FileSize != EndOfFile) { + // + // file is not the proper size, change it + // + DEBUG ((EFI_D_INIT, "PlOpenBlock: Initializing block device: %hs\n", Private->FileName)); + + // + // first set it to 0 + // + SetFilePointer64 (Private, 0, NULL, FILE_BEGIN); + SetEndOfFile (Private->NtHandle); + + // + // then set it to the needed file size (OS will zero fill it) + // + SetFilePointer64 (Private, EndOfFile, NULL, FILE_BEGIN); + SetEndOfFile (Private->NtHandle); + } + + DEBUG ((EFI_D_INIT, "PlOpenBlock: opened %S\n", Private->FileName)); Status = EFI_SUCCESS; Done: -- 2.16.1.windows.1