3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Produce block IO abstractions for real devices on your PC using Win32 APIs.
19 The configuration of what devices to mount or emulate comes from NT
20 environment variables. The variables must be visible to the Microsoft*
21 Developer Studio for them to work.
23 <F>ixed - Fixed disk like a hard drive.
24 <R>emovable - Removable media like a floppy or CD-ROM.
25 Read <O>nly - Write protected device.
26 Read <W>rite - Read write device.
27 <block count> - Decimal number of blocks a device supports.
28 <block size> - Decimal number of bytes per block.
30 NT envirnonment variable contents. '<' and '>' are not part of the variable,
31 they are just used to make this help more readable. There should be no
32 spaces between the ';'. Extra spaces will break the variable. A '!' is
33 used to seperate multiple devices in a variable.
35 EFI_WIN_NT_VIRTUAL_DISKS =
36 <F | R><O | W>;<block count>;<block size>[!...]
38 EFI_WIN_NT_PHYSICAL_DISKS =
39 <drive letter>:<F | R><O | W>;<block count>;<block size>[!...]
41 Virtual Disks: These devices use a file to emulate a hard disk or removable
44 Thus a 20 MB emulated hard drive would look like:
45 EFI_WIN_NT_VIRTUAL_DISKS=FW;40960;512
47 A 1.44MB emulated floppy with a block size of 1024 would look like:
48 EFI_WIN_NT_VIRTUAL_DISKS=RW;1440;1024
50 Physical Disks: These devices use NT to open a real device in your system
52 Thus a 120 MB floppy would look like:
53 EFI_WIN_NT_PHYSICAL_DISKS=B:RW;245760;512
55 Thus a standard CD-ROM floppy would look like:
56 EFI_WIN_NT_PHYSICAL_DISKS=Z:RO;307200;2048
59 * Other names and brands may be claimed as the property of others.
63 #include "WinNtBlockIo.h"
65 EFI_DRIVER_BINDING_PROTOCOL gWinNtBlockIoDriverBinding
= {
66 WinNtBlockIoDriverBindingSupported
,
67 WinNtBlockIoDriverBindingStart
,
68 WinNtBlockIoDriverBindingStop
,
77 WinNtBlockIoDriverBindingSupported (
78 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
80 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
93 // TODO: This - add argument and description to function comment
94 // TODO: Handle - add argument and description to function comment
95 // TODO: RemainingDevicePath - add argument and description to function comment
98 EFI_WIN_NT_IO_PROTOCOL
*WinNtIo
;
101 // Open the IO Abstraction(s) needed to perform the supported test
103 Status
= gBS
->OpenProtocol (
105 &gEfiWinNtIoProtocolGuid
,
107 This
->DriverBindingHandle
,
109 EFI_OPEN_PROTOCOL_BY_DRIVER
111 if (EFI_ERROR (Status
)) {
116 // Make sure the WinNtThunkProtocol is valid
118 Status
= EFI_UNSUPPORTED
;
119 if (WinNtIo
->WinNtThunk
->Signature
== EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE
) {
122 // Check the GUID to see if this is a handle type the driver supports
124 if (CompareGuid (WinNtIo
->TypeGuid
, &gEfiWinNtVirtualDisksGuid
) ||
125 CompareGuid (WinNtIo
->TypeGuid
, &gEfiWinNtPhysicalDisksGuid
) ) {
126 Status
= EFI_SUCCESS
;
131 // Close the I/O Abstraction(s) used to perform the supported test
135 &gEfiWinNtIoProtocolGuid
,
136 This
->DriverBindingHandle
,
145 WinNtBlockIoDriverBindingStart (
146 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
147 IN EFI_HANDLE Handle
,
148 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
161 // TODO: This - add argument and description to function comment
162 // TODO: Handle - add argument and description to function comment
163 // TODO: RemainingDevicePath - add argument and description to function comment
166 EFI_WIN_NT_IO_PROTOCOL
*WinNtIo
;
167 WIN_NT_RAW_DISK_DEVICE_TYPE DiskType
;
168 UINT16 Buffer
[FILENAME_BUFFER_SIZE
];
170 BOOLEAN RemovableMedia
;
171 BOOLEAN WriteProtected
;
172 UINTN NumberOfBlocks
;
176 // Grab the protocols we need
178 Status
= gBS
->OpenProtocol (
180 &gEfiWinNtIoProtocolGuid
,
182 This
->DriverBindingHandle
,
184 EFI_OPEN_PROTOCOL_BY_DRIVER
186 if (EFI_ERROR (Status
)) {
193 if (CompareGuid (WinNtIo
->TypeGuid
, &gEfiWinNtVirtualDisksGuid
)) {
194 DiskType
= EfiWinNtVirtualDisks
;
195 } else if (CompareGuid (WinNtIo
->TypeGuid
, &gEfiWinNtPhysicalDisksGuid
)) {
196 DiskType
= EfiWinNtPhysicalDisks
;
198 Status
= EFI_UNSUPPORTED
;
202 Status
= EFI_NOT_FOUND
;
203 Str
= WinNtIo
->EnvString
;
204 if (DiskType
== EfiWinNtVirtualDisks
) {
205 WinNtIo
->WinNtThunk
->SPrintf (
209 WinNtIo
->InstanceNumber
212 if (*Str
>= 'A' && *Str
<= 'Z' || *Str
>= 'a' && *Str
<= 'z') {
213 WinNtIo
->WinNtThunk
->SPrintf (Buffer
, sizeof (Buffer
), L
"\\\\.\\%c:", *Str
);
215 WinNtIo
->WinNtThunk
->SPrintf (Buffer
, sizeof (Buffer
), L
"\\\\.\\PHYSICALDRIVE%c", *Str
);
220 Status
= EFI_NOT_FOUND
;
227 if (*Str
== 'R' || *Str
== 'F') {
228 RemovableMedia
= (BOOLEAN
) (*Str
== 'R');
230 if (*Str
== 'O' || *Str
== 'W') {
231 WriteProtected
= (BOOLEAN
) (*Str
== 'O');
232 Str
= GetNextElementPastTerminator (Str
, ';');
234 NumberOfBlocks
= Atoi (Str
);
235 if (NumberOfBlocks
!= 0) {
236 Str
= GetNextElementPastTerminator (Str
, ';');
237 BlockSize
= Atoi (Str
);
238 if (BlockSize
!= 0) {
240 // If we get here the variable is valid so do the work.
242 Status
= WinNtBlockIoCreateMapping (
259 if (EFI_ERROR (Status
)) {
262 &gEfiWinNtIoProtocolGuid
,
263 This
->DriverBindingHandle
,
273 WinNtBlockIoDriverBindingStop (
274 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
275 IN EFI_HANDLE Handle
,
276 IN UINTN NumberOfChildren
,
277 IN EFI_HANDLE
*ChildHandleBuffer
283 TODO: Add function description
287 This - TODO: add argument description
288 Handle - TODO: add argument description
289 NumberOfChildren - TODO: add argument description
290 ChildHandleBuffer - TODO: add argument description
294 EFI_UNSUPPORTED - TODO: Add description for return value
298 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
300 WIN_NT_BLOCK_IO_PRIVATE
*Private
;
303 // Get our context back
305 Status
= gBS
->OpenProtocol (
307 &gEfiBlockIoProtocolGuid
,
309 This
->DriverBindingHandle
,
311 EFI_OPEN_PROTOCOL_GET_PROTOCOL
313 if (EFI_ERROR (Status
)) {
314 return EFI_UNSUPPORTED
;
317 Private
= WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (BlockIo
);
320 // BugBug: If we need to kick people off, we need to make Uninstall Close the handles.
321 // We could pass in our image handle or FLAG our open to be closed via
322 // Unistall (== to saying any CloseProtocol will close our open)
324 Status
= gBS
->UninstallMultipleProtocolInterfaces (
326 &gEfiBlockIoProtocolGuid
,
330 if (!EFI_ERROR (Status
)) {
332 Status
= gBS
->CloseProtocol (
334 &gEfiWinNtIoProtocolGuid
,
335 This
->DriverBindingHandle
,
340 // Shut down our device
342 Private
->WinNtThunk
->CloseHandle (Private
->NtHandle
);
345 // Free our instance data
347 FreeUnicodeStringTable (Private
->ControllerNameTable
);
357 GetNextElementPastTerminator (
358 IN CHAR16
*EnvironmentVariable
,
365 Worker function to parse environment variables.
368 EnvironmentVariable - Envirnment variable to parse.
370 Terminator - Terminator to parse for.
374 Pointer to next eliment past the first occurence of Terminator or the '\0'
375 at the end of the string.
381 for (Ptr
= EnvironmentVariable
; *Ptr
!= '\0'; Ptr
++) {
382 if (*Ptr
== Terminator
) {
393 WinNtBlockIoCreateMapping (
394 IN EFI_WIN_NT_IO_PROTOCOL
*WinNtIo
,
395 IN EFI_HANDLE EfiDeviceHandle
,
398 IN BOOLEAN RemovableMedia
,
399 IN UINTN NumberOfBlocks
,
401 IN WIN_NT_RAW_DISK_DEVICE_TYPE DeviceType
407 TODO: Add function description
411 WinNtIo - TODO: add argument description
412 EfiDeviceHandle - TODO: add argument description
413 Filename - TODO: add argument description
414 ReadOnly - TODO: add argument description
415 RemovableMedia - TODO: add argument description
416 NumberOfBlocks - TODO: add argument description
417 BlockSize - TODO: add argument description
418 DeviceType - TODO: add argument description
422 TODO: add return values
427 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
428 WIN_NT_BLOCK_IO_PRIVATE
*Private
;
431 WinNtIo
->WinNtThunk
->SetErrorMode (SEM_FAILCRITICALERRORS
);
433 Private
= AllocatePool (sizeof (WIN_NT_BLOCK_IO_PRIVATE
));
434 ASSERT (Private
!= NULL
);
436 EfiInitializeLock (&Private
->Lock
, TPL_NOTIFY
);
438 Private
->WinNtThunk
= WinNtIo
->WinNtThunk
;
440 Private
->Signature
= WIN_NT_BLOCK_IO_PRIVATE_SIGNATURE
;
441 Private
->LastBlock
= NumberOfBlocks
- 1;
442 Private
->BlockSize
= BlockSize
;
444 for (Index
= 0; Filename
[Index
] != 0; Index
++) {
445 Private
->Filename
[Index
] = Filename
[Index
];
448 Private
->Filename
[Index
] = 0;
450 Private
->ReadMode
= GENERIC_READ
| (ReadOnly
? 0 : GENERIC_WRITE
);
451 Private
->ShareMode
= FILE_SHARE_READ
| FILE_SHARE_WRITE
;
453 Private
->NumberOfBlocks
= NumberOfBlocks
;
454 Private
->DeviceType
= DeviceType
;
455 Private
->NtHandle
= INVALID_HANDLE_VALUE
;
457 Private
->ControllerNameTable
= NULL
;
461 gWinNtBlockIoComponentName
.SupportedLanguages
,
462 &Private
->ControllerNameTable
,
466 BlockIo
= &Private
->BlockIo
;
467 BlockIo
->Revision
= EFI_BLOCK_IO_PROTOCOL_REVISION
;
468 BlockIo
->Media
= &Private
->Media
;
469 BlockIo
->Media
->BlockSize
= Private
->BlockSize
;
470 BlockIo
->Media
->LastBlock
= Private
->NumberOfBlocks
- 1;
471 BlockIo
->Media
->MediaId
= 0;;
473 BlockIo
->Reset
= WinNtBlockIoResetBlock
;
474 BlockIo
->ReadBlocks
= WinNtBlockIoReadBlocks
;
475 BlockIo
->WriteBlocks
= WinNtBlockIoWriteBlocks
;
476 BlockIo
->FlushBlocks
= WinNtBlockIoFlushBlocks
;
478 BlockIo
->Media
->ReadOnly
= ReadOnly
;
479 BlockIo
->Media
->RemovableMedia
= RemovableMedia
;
480 BlockIo
->Media
->LogicalPartition
= FALSE
;
481 BlockIo
->Media
->MediaPresent
= TRUE
;
482 BlockIo
->Media
->WriteCaching
= FALSE
;
484 if (DeviceType
== EfiWinNtVirtualDisks
) {
485 BlockIo
->Media
->IoAlign
= 1;
488 // Create a file to use for a virtual disk even if it does not exist.
490 Private
->OpenMode
= OPEN_ALWAYS
;
491 } else if (DeviceType
== EfiWinNtPhysicalDisks
) {
493 // Physical disk and floppy devices require 4 byte alignment.
495 BlockIo
->Media
->IoAlign
= 4;
498 // You can only open a physical device if it exists.
500 Private
->OpenMode
= OPEN_EXISTING
;
505 Private
->EfiHandle
= EfiDeviceHandle
;
506 Status
= WinNtBlockIoOpenDevice (Private
);
507 if (!EFI_ERROR (Status
)) {
509 Status
= gBS
->InstallMultipleProtocolInterfaces (
511 &gEfiBlockIoProtocolGuid
,
515 if (EFI_ERROR (Status
)) {
516 FreeUnicodeStringTable (Private
->ControllerNameTable
);
520 DEBUG ((EFI_D_INIT
, "BlockDevice added: %s\n", Filename
));
528 WinNtBlockIoOpenDevice (
529 WIN_NT_BLOCK_IO_PRIVATE
*Private
535 TODO: Add function description
539 Private - TODO: add argument description
543 TODO: add return values
550 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
552 BlockIo
= &Private
->BlockIo
;
553 EfiAcquireLock (&Private
->Lock
);
556 // If the device is already opened, close it
558 if (Private
->NtHandle
!= INVALID_HANDLE_VALUE
) {
559 BlockIo
->Reset (BlockIo
, FALSE
);
565 Private
->NtHandle
= Private
->WinNtThunk
->CreateFile (
575 Status
= Private
->WinNtThunk
->GetLastError ();
577 if (Private
->NtHandle
== INVALID_HANDLE_VALUE
) {
578 DEBUG ((EFI_D_INFO
, "PlOpenBlock: Could not open %s, %x\n", Private
->Filename
, Private
->WinNtThunk
->GetLastError ()));
579 BlockIo
->Media
->MediaPresent
= FALSE
;
580 Status
= EFI_NO_MEDIA
;
584 if (!BlockIo
->Media
->MediaPresent
) {
586 // BugBug: try to emulate if a CD appears - notify drivers to check it out
588 BlockIo
->Media
->MediaPresent
= TRUE
;
589 EfiReleaseLock (&Private
->Lock
);
590 EfiAcquireLock (&Private
->Lock
);
594 // get the size of the file
596 Status
= SetFilePointer64 (Private
, 0, &FileSize
, FILE_END
);
598 if (EFI_ERROR (Status
)) {
599 FileSize
= MultU64x32 (Private
->NumberOfBlocks
, Private
->BlockSize
);
600 if (Private
->DeviceType
== EfiWinNtVirtualDisks
) {
601 DEBUG ((EFI_D_ERROR
, "PlOpenBlock: Could not get filesize of %s\n", Private
->Filename
));
602 Status
= EFI_UNSUPPORTED
;
607 if (Private
->NumberOfBlocks
== 0) {
608 Private
->NumberOfBlocks
= DivU64x32 (FileSize
, Private
->BlockSize
);
611 EndOfFile
= MultU64x32 (Private
->NumberOfBlocks
, Private
->BlockSize
);
613 if (FileSize
!= EndOfFile
) {
615 // file is not the proper size, change it
617 DEBUG ((EFI_D_INIT
, "PlOpenBlock: Initializing block device: %hs\n", Private
->Filename
));
622 SetFilePointer64 (Private
, 0, NULL
, FILE_BEGIN
);
623 Private
->WinNtThunk
->SetEndOfFile (Private
->NtHandle
);
626 // then set it to the needed file size (OS will zero fill it)
628 SetFilePointer64 (Private
, EndOfFile
, NULL
, FILE_BEGIN
);
629 Private
->WinNtThunk
->SetEndOfFile (Private
->NtHandle
);
632 DEBUG ((EFI_D_INIT
, "%HPlOpenBlock: opened %s%N\n", Private
->Filename
));
633 Status
= EFI_SUCCESS
;
636 if (EFI_ERROR (Status
)) {
637 if (Private
->NtHandle
!= INVALID_HANDLE_VALUE
) {
638 BlockIo
->Reset (BlockIo
, FALSE
);
642 EfiReleaseLock (&Private
->Lock
);
649 IN WIN_NT_BLOCK_IO_PRIVATE
*Private
655 TODO: Add function description
659 Private - TODO: add argument description
663 TODO: add return values
667 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
669 BOOLEAN ReinstallBlockIoFlag
;
671 BlockIo
= &Private
->BlockIo
;
673 switch (Private
->WinNtThunk
->GetLastError ()) {
675 case ERROR_NOT_READY
:
676 Status
= EFI_NO_MEDIA
;
677 BlockIo
->Media
->ReadOnly
= FALSE
;
678 BlockIo
->Media
->MediaPresent
= FALSE
;
679 ReinstallBlockIoFlag
= FALSE
;
682 case ERROR_WRONG_DISK
:
683 BlockIo
->Media
->ReadOnly
= FALSE
;
684 BlockIo
->Media
->MediaPresent
= TRUE
;
685 BlockIo
->Media
->MediaId
+= 1;
686 ReinstallBlockIoFlag
= TRUE
;
687 Status
= EFI_MEDIA_CHANGED
;
690 case ERROR_WRITE_PROTECT
:
691 BlockIo
->Media
->ReadOnly
= TRUE
;
692 ReinstallBlockIoFlag
= FALSE
;
693 Status
= EFI_WRITE_PROTECTED
;
697 ReinstallBlockIoFlag
= FALSE
;
698 Status
= EFI_DEVICE_ERROR
;
702 if (ReinstallBlockIoFlag
) {
703 BlockIo
->Reset (BlockIo
, FALSE
);
705 gBS
->ReinstallProtocolInterface (
707 &gEfiBlockIoProtocolGuid
,
718 WinNtBlockIoReadWriteCommon (
719 IN WIN_NT_BLOCK_IO_PRIVATE
*Private
,
730 TODO: Add function description
734 Private - TODO: add argument description
735 MediaId - TODO: add argument description
736 Lba - TODO: add argument description
737 BufferSize - TODO: add argument description
738 Buffer - TODO: add argument description
739 CallerName - TODO: add argument description
743 EFI_NO_MEDIA - TODO: Add description for return value
744 EFI_MEDIA_CHANGED - TODO: Add description for return value
745 EFI_INVALID_PARAMETER - TODO: Add description for return value
746 EFI_SUCCESS - TODO: Add description for return value
747 EFI_BAD_BUFFER_SIZE - TODO: Add description for return value
748 EFI_INVALID_PARAMETER - TODO: Add description for return value
749 EFI_SUCCESS - TODO: Add description for return value
756 INT64 DistanceToMove
;
757 UINT64 DistanceMoved
;
759 if (Private
->NtHandle
== INVALID_HANDLE_VALUE
) {
760 Status
= WinNtBlockIoOpenDevice (Private
);
761 if (EFI_ERROR (Status
)) {
766 if (!Private
->Media
.MediaPresent
) {
767 DEBUG ((EFI_D_INIT
, "%s: No Media\n", CallerName
));
771 if (Private
->Media
.MediaId
!= MediaId
) {
772 return EFI_MEDIA_CHANGED
;
775 if ((UINT32
) Buffer
% Private
->Media
.IoAlign
!= 0) {
776 return EFI_INVALID_PARAMETER
;
780 // Verify buffer size
782 BlockSize
= Private
->BlockSize
;
783 if (BufferSize
== 0) {
784 DEBUG ((EFI_D_INIT
, "%s: Zero length read\n", CallerName
));
788 if ((BufferSize
% BlockSize
) != 0) {
789 DEBUG ((EFI_D_INIT
, "%s: Invalid read size\n", CallerName
));
790 return EFI_BAD_BUFFER_SIZE
;
793 LastBlock
= Lba
+ (BufferSize
/ BlockSize
) - 1;
794 if (LastBlock
> Private
->LastBlock
) {
795 DEBUG ((EFI_D_INIT
, "ReadBlocks: Attempted to read off end of device\n"));
796 return EFI_INVALID_PARAMETER
;
799 // Seek to End of File
801 DistanceToMove
= MultU64x32 (Lba
, BlockSize
);
802 Status
= SetFilePointer64 (Private
, DistanceToMove
, &DistanceMoved
, FILE_BEGIN
);
804 if (EFI_ERROR (Status
)) {
805 DEBUG ((EFI_D_INIT
, "WriteBlocks: SetFilePointer failed\n"));
806 return WinNtBlockIoError (Private
);
815 WinNtBlockIoReadBlocks (
816 IN EFI_BLOCK_IO_PROTOCOL
*This
,
825 Read BufferSize bytes from Lba into Buffer.
828 This - Protocol instance pointer.
829 MediaId - Id of the media, changes every time the media is replaced.
830 Lba - The starting Logical Block Address to read from
831 BufferSize - Size of Buffer, must be a multiple of device block size.
832 Buffer - Buffer containing read data
835 EFI_SUCCESS - The data was read correctly from the device.
836 EFI_DEVICE_ERROR - The device reported an error while performing the read.
837 EFI_NO_MEDIA - There is no media in the device.
838 EFI_MEDIA_CHANGED - The MediaId does not matched the current device.
839 EFI_BAD_BUFFER_SIZE - The Buffer was not a multiple of the block size of the
841 EFI_INVALID_PARAMETER - The read request contains device addresses that are not
842 valid for the device.
846 WIN_NT_BLOCK_IO_PRIVATE
*Private
;
852 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
854 Private
= WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This
);
856 Status
= WinNtBlockIoReadWriteCommon (Private
, MediaId
, Lba
, BufferSize
, Buffer
, "WinNtReadBlocks");
857 if (EFI_ERROR (Status
)) {
861 Flag
= Private
->WinNtThunk
->ReadFile (Private
->NtHandle
, Buffer
, (DWORD
) BufferSize
, (LPDWORD
) &BytesRead
, NULL
);
862 if (!Flag
|| (BytesRead
!= BufferSize
)) {
863 DEBUG ((EFI_D_INIT
, "ReadBlocks: ReadFile failed. (%d)\n", Private
->WinNtThunk
->GetLastError ()));
864 Status
= WinNtBlockIoError (Private
);
869 // If we wrote then media is present.
871 This
->Media
->MediaPresent
= TRUE
;
872 Status
= EFI_SUCCESS
;
875 gBS
->RestoreTPL (OldTpl
);
882 WinNtBlockIoWriteBlocks (
883 IN EFI_BLOCK_IO_PROTOCOL
*This
,
892 Write BufferSize bytes from Lba into Buffer.
895 This - Protocol instance pointer.
896 MediaId - Id of the media, changes every time the media is replaced.
897 Lba - The starting Logical Block Address to read from
898 BufferSize - Size of Buffer, must be a multiple of device block size.
899 Buffer - Buffer containing read data
902 EFI_SUCCESS - The data was written correctly to the device.
903 EFI_WRITE_PROTECTED - The device can not be written to.
904 EFI_DEVICE_ERROR - The device reported an error while performing the write.
905 EFI_NO_MEDIA - There is no media in the device.
906 EFI_MEDIA_CHNAGED - The MediaId does not matched the current device.
907 EFI_BAD_BUFFER_SIZE - The Buffer was not a multiple of the block size of the
909 EFI_INVALID_PARAMETER - The write request contains a LBA that is not
910 valid for the device.
914 WIN_NT_BLOCK_IO_PRIVATE
*Private
;
920 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
922 Private
= WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This
);
924 Status
= WinNtBlockIoReadWriteCommon (Private
, MediaId
, Lba
, BufferSize
, Buffer
, "WinNtWriteBlocks");
925 if (EFI_ERROR (Status
)) {
929 Flag
= Private
->WinNtThunk
->WriteFile (Private
->NtHandle
, Buffer
, (DWORD
) BufferSize
, (LPDWORD
) &BytesWritten
, NULL
);
930 if (!Flag
|| (BytesWritten
!= BufferSize
)) {
931 DEBUG ((EFI_D_INIT
, "ReadBlocks: WriteFile failed. (%d)\n", Private
->WinNtThunk
->GetLastError ()));
932 Status
= WinNtBlockIoError (Private
);
937 // If the write succeeded, we are not write protected and media is present.
939 This
->Media
->MediaPresent
= TRUE
;
940 This
->Media
->ReadOnly
= FALSE
;
941 Status
= EFI_SUCCESS
;
944 gBS
->RestoreTPL (OldTpl
);
952 WinNtBlockIoFlushBlocks (
953 IN EFI_BLOCK_IO_PROTOCOL
*This
958 Flush the Block Device.
961 This - Protocol instance pointer.
964 EFI_SUCCESS - All outstanding data was written to the device
965 EFI_DEVICE_ERROR - The device reported an error while writting back the data
966 EFI_NO_MEDIA - There is no media in the device.
976 WinNtBlockIoResetBlock (
977 IN EFI_BLOCK_IO_PROTOCOL
*This
,
978 IN BOOLEAN ExtendedVerification
983 Reset the Block Device.
986 This - Protocol instance pointer.
987 ExtendedVerification - Driver may perform diagnostics on reset.
990 EFI_SUCCESS - The device was reset.
991 EFI_DEVICE_ERROR - The device is not functioning properly and could
996 WIN_NT_BLOCK_IO_PRIVATE
*Private
;
999 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
1001 Private
= WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This
);
1003 if (Private
->NtHandle
!= INVALID_HANDLE_VALUE
) {
1004 Private
->WinNtThunk
->CloseHandle (Private
->NtHandle
);
1005 Private
->NtHandle
= INVALID_HANDLE_VALUE
;
1008 gBS
->RestoreTPL (OldTpl
);
1019 Routine Description:
1021 Convert a unicode string to a UINTN
1025 String - Unicode string.
1029 UINTN of the number represented by String.
1037 // skip preceeding white space
1040 while ((*Str
) && (*Str
== ' ')) {
1044 // Convert ot a Number
1047 while (*Str
!= '\0') {
1048 if ((*Str
>= '0') && (*Str
<= '9')) {
1049 Number
= (Number
* 10) +*Str
- '0';
1062 IN WIN_NT_BLOCK_IO_PRIVATE
*Private
,
1063 IN INT64 DistanceToMove
,
1064 OUT UINT64
*NewFilePointer
,
1069 This function extends the capability of SetFilePointer to accept 64 bit parameters
1072 // TODO: function comment is missing 'Routine Description:'
1073 // TODO: function comment is missing 'Arguments:'
1074 // TODO: function comment is missing 'Returns:'
1075 // TODO: Private - add argument and description to function comment
1076 // TODO: DistanceToMove - add argument and description to function comment
1077 // TODO: NewFilePointer - add argument and description to function comment
1078 // TODO: MoveMethod - add argument and description to function comment
1081 LARGE_INTEGER LargeInt
;
1084 LargeInt
.QuadPart
= DistanceToMove
;
1085 Status
= EFI_SUCCESS
;
1087 LargeInt
.LowPart
= Private
->WinNtThunk
->SetFilePointer (
1094 if (LargeInt
.LowPart
== -1 &&
1095 (ErrorCode
= Private
->WinNtThunk
->GetLastError ()) != NO_ERROR
) {
1096 Status
= EFI_INVALID_PARAMETER
;
1099 if (NewFilePointer
!= NULL
) {
1100 *NewFilePointer
= LargeInt
.QuadPart
;