/**@file\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
Module Name:\r
\r
BlockIo = &Private->BlockIo;\r
BlockIo->Revision = EFI_BLOCK_IO_PROTOCOL_REVISION;\r
BlockIo->Media = &Private->Media;\r
- BlockIo->Media->BlockSize = Private->BlockSize;\r
+ BlockIo->Media->BlockSize = (UINT32)Private->BlockSize;\r
BlockIo->Media->LastBlock = Private->NumberOfBlocks - 1;\r
BlockIo->Media->MediaId = 0;;\r
\r
//\r
Private->NtHandle = Private->WinNtThunk->CreateFile (\r
Private->Filename,\r
- Private->ReadMode,\r
- Private->ShareMode,\r
+ (DWORD)Private->ReadMode,\r
+ (DWORD)Private->ShareMode,\r
NULL,\r
- Private->OpenMode,\r
+ (DWORD)Private->OpenMode,\r
0,\r
NULL\r
);\r
Status = SetFilePointer64 (Private, 0, &FileSize, FILE_END);\r
\r
if (EFI_ERROR (Status)) {\r
- FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
+ FileSize = MultU64x32 (Private->NumberOfBlocks, (UINT32)Private->BlockSize);\r
if (Private->DeviceType == EfiWinNtVirtualDisks) {\r
DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %s\n", Private->Filename));\r
Status = EFI_UNSUPPORTED;\r
}\r
\r
if (Private->NumberOfBlocks == 0) {\r
- Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);\r
+ Private->NumberOfBlocks = DivU64x32 (FileSize, (UINT32)Private->BlockSize);\r
}\r
\r
- EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
+ EndOfFile = MultU64x32 (Private->NumberOfBlocks, (UINT32)Private->BlockSize);\r
\r
if (FileSize != EndOfFile) {\r
//\r
return EFI_MEDIA_CHANGED;\r
}\r
\r
- if ((UINT32) Buffer % Private->Media.IoAlign != 0) {\r
+ if ((UINTN) Buffer % Private->Media.IoAlign != 0) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// Seek to End of File\r
//\r
- DistanceToMove = MultU64x32 (Lba, BlockSize);\r
+ DistanceToMove = MultU64x32 (Lba, (UINT32)BlockSize);\r
Status = SetFilePointer64 (Private, DistanceToMove, &DistanceMoved, FILE_BEGIN);\r
\r
if (EFI_ERROR (Status)) {\r
WIN_NT_BLOCK_IO_PRIVATE *Private;\r
UINTN BytesWritten;\r
BOOL Flag;\r
+ BOOL Locked;\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
+ UINTN BytesReturned;\r
\r
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
goto Done;\r
}\r
\r
+ //\r
+ // According the Windows requirement, first need to lock the volume before \r
+ // write to it.\r
+ //\r
+ if (Private->DeviceType == EfiWinNtPhysicalDisks) {\r
+ Locked = Private->WinNtThunk->DeviceIoControl (Private->NtHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &BytesReturned, NULL);\r
+ if (Locked == 0) {\r
+ DEBUG ((EFI_D_INIT, "ReadBlocks: Lock volume failed. (%d)\n", Private->WinNtThunk->GetLastError ()));\r
+ Status = WinNtBlockIoError (Private);\r
+ goto Done;\r
+ }\r
+ } else {\r
+ Locked = 0;\r
+ }\r
Flag = Private->WinNtThunk->WriteFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesWritten, NULL);\r
+ if (Locked != 0) {\r
+ Private->WinNtThunk->DeviceIoControl (Private->NtHandle, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &BytesReturned, NULL);\r
+ }\r
if (!Flag || (BytesWritten != BufferSize)) {\r
DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed. (%d)\n", Private->WinNtThunk->GetLastError ()));\r
Status = WinNtBlockIoError (Private);\r
{\r
EFI_STATUS Status;\r
LARGE_INTEGER LargeInt;\r
- UINT32 ErrorCode;\r
\r
LargeInt.QuadPart = DistanceToMove;\r
Status = EFI_SUCCESS;\r
MoveMethod\r
);\r
\r
- if (LargeInt.LowPart == -1 &&\r
- (ErrorCode = Private->WinNtThunk->GetLastError ()) != NO_ERROR) {\r
+ if (LargeInt.LowPart == -1 && Private->WinNtThunk->GetLastError () != NO_ERROR) {\r
Status = EFI_INVALID_PARAMETER;\r
}\r
\r