1 /**@file
2 
3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4 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
8 
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.
11 
12 Module Name:
13 
14   WinNtBlockIo.h
15 
16 Abstract:
17 
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.
22 
23   * Other names and brands may be claimed as the property of others.
24 
25 **/
26 
27 #ifndef _WIN_NT_BLOCK_IO_H_
28 #define _WIN_NT_BLOCK_IO_H_
29 
30 #include <Uefi.h>
31 #include <WinNtDxe.h>
32 #include <Protocol/WinNtThunk.h>
33 #include <Protocol/WinNtIo.h>
34 #include <Protocol/BlockIo.h>
35 #include <Protocol/ComponentName.h>
36 #include <Protocol/DriverBinding.h>
37 //
38 // The Library classes this module consumes
39 //
40 #include <Library/DebugLib.h>
41 #include <Library/BaseLib.h>
42 #include <Library/UefiDriverEntryPoint.h>
43 #include <Library/UefiLib.h>
44 #include <Library/BaseMemoryLib.h>
45 #include <Library/UefiBootServicesTableLib.h>
46 #include <Library/MemoryAllocationLib.h>
47 
48 #define FILENAME_BUFFER_SIZE  80
49 
50 //
51 // Language supported for driverconfiguration protocol
52 //
53 #define LANGUAGESUPPORTED "eng"
54 
55 typedef enum {
56   EfiWinNtVirtualDisks,
57   EfiWinNtPhysicalDisks,
58   EifWinNtMaxTypeDisks
59 } WIN_NT_RAW_DISK_DEVICE_TYPE;
60 
61 #define WIN_NT_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('N', 'T', 'b', 'k')
62 typedef struct {
63   UINTN                       Signature;
64 
65   EFI_LOCK                    Lock;
66 
67   CHAR16                      Filename[FILENAME_BUFFER_SIZE];
68   UINTN                       ReadMode;
69   UINTN                       ShareMode;
70   UINTN                       OpenMode;
71 
72   HANDLE                      NtHandle;
73   WIN_NT_RAW_DISK_DEVICE_TYPE DeviceType;
74 
75   UINT64                      LastBlock;
76   UINTN                       BlockSize;
77   UINT64                      NumberOfBlocks;
78 
79   EFI_HANDLE                  EfiHandle;
80   EFI_BLOCK_IO_PROTOCOL       BlockIo;
81   EFI_BLOCK_IO_MEDIA          Media;
82 
83   EFI_UNICODE_STRING_TABLE    *ControllerNameTable;
84 
85   EFI_WIN_NT_THUNK_PROTOCOL   *WinNtThunk;
86 
87 } WIN_NT_BLOCK_IO_PRIVATE;
88 
89 #define WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \
90          CR(a, WIN_NT_BLOCK_IO_PRIVATE, BlockIo, WIN_NT_BLOCK_IO_PRIVATE_SIGNATURE)
91 
92 #define LIST_BUFFER_SIZE  512
93 
94 //
95 // Block I/O Global Variables
96 //
97 extern EFI_DRIVER_BINDING_PROTOCOL         gWinNtBlockIoDriverBinding;
98 extern EFI_COMPONENT_NAME_PROTOCOL         gWinNtBlockIoComponentName;
99 extern EFI_COMPONENT_NAME2_PROTOCOL        gWinNtBlockIoComponentName2;
100 extern EFI_DRIVER_CONFIGURATION_PROTOCOL   gWinNtBlockIoDriverConfiguration;
101 extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL     gWinNtBlockIoDriverDiagnostics;
102 extern EFI_DRIVER_DIAGNOSTICS2_PROTOCOL    gWinNtBlockIoDriverDiagnostics2;
103 
104 //
105 // EFI Driver Binding Functions
106 //
107 EFI_STATUS
108 EFIAPI
109 WinNtBlockIoDriverBindingSupported (
110   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
111   IN  EFI_HANDLE                    Handle,
112   IN  EFI_DEVICE_PATH_PROTOCOL      *RemainingDevicePath
113   )
114 /*++
115 
116 Routine Description:
117 
118   TODO: Add function description
119 
120 Arguments:
121 
122   This                - TODO: add argument description
123   Handle              - TODO: add argument description
124   RemainingDevicePath - TODO: add argument description
125 
126 Returns:
127 
128   TODO: add return values
129 
130 --*/
131 ;
132 
133 EFI_STATUS
134 EFIAPI
135 WinNtBlockIoDriverBindingStart (
136   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
137   IN  EFI_HANDLE                    Handle,
138   IN  EFI_DEVICE_PATH_PROTOCOL      *RemainingDevicePath
139   )
140 /*++
141 
142 Routine Description:
143 
144   TODO: Add function description
145 
146 Arguments:
147 
148   This                - TODO: add argument description
149   Handle              - TODO: add argument description
150   RemainingDevicePath - TODO: add argument description
151 
152 Returns:
153 
154   TODO: add return values
155 
156 --*/
157 ;
158 
159 EFI_STATUS
160 EFIAPI
161 WinNtBlockIoDriverBindingStop (
162   IN  EFI_DRIVER_BINDING_PROTOCOL   *This,
163   IN  EFI_HANDLE                    Handle,
164   IN  UINTN                         NumberOfChildren,
165   IN  EFI_HANDLE                    *ChildHandleBuffer
166   )
167 /*++
168 
169 Routine Description:
170 
171   TODO: Add function description
172 
173 Arguments:
174 
175   This              - TODO: add argument description
176   Handle            - TODO: add argument description
177   NumberOfChildren  - TODO: add argument description
178   ChildHandleBuffer - TODO: add argument description
179 
180 Returns:
181 
182   TODO: add return values
183 
184 --*/
185 ;
186 
187 //
188 // Block IO protocol member functions
189 //
190 EFI_STATUS
191 EFIAPI
192 WinNtBlockIoReadBlocks (
193   IN EFI_BLOCK_IO_PROTOCOL  *This,
194   IN UINT32                 MediaId,
195   IN EFI_LBA                Lba,
196   IN UINTN                  BufferSize,
197   OUT VOID                  *Buffer
198   )
199 /*++
200 
201 Routine Description:
202 
203   TODO: Add function description
204 
205 Arguments:
206 
207   This        - TODO: add argument description
208   MediaId     - TODO: add argument description
209   Lba         - TODO: add argument description
210   BufferSize  - TODO: add argument description
211   Buffer      - TODO: add argument description
212 
213 Returns:
214 
215   TODO: add return values
216 
217 --*/
218 ;
219 
220 EFI_STATUS
221 EFIAPI
222 WinNtBlockIoWriteBlocks (
223   IN EFI_BLOCK_IO_PROTOCOL  *This,
224   IN UINT32                 MediaId,
225   IN EFI_LBA                Lba,
226   IN UINTN                  BufferSize,
227   IN VOID                   *Buffer
228   )
229 /*++
230 
231 Routine Description:
232 
233   TODO: Add function description
234 
235 Arguments:
236 
237   This        - TODO: add argument description
238   MediaId     - TODO: add argument description
239   Lba         - TODO: add argument description
240   BufferSize  - TODO: add argument description
241   Buffer      - TODO: add argument description
242 
243 Returns:
244 
245   TODO: add return values
246 
247 --*/
248 ;
249 
250 EFI_STATUS
251 EFIAPI
252 WinNtBlockIoFlushBlocks (
253   IN EFI_BLOCK_IO_PROTOCOL  *This
254   )
255 /*++
256 
257 Routine Description:
258 
259   TODO: Add function description
260 
261 Arguments:
262 
263   This  - TODO: add argument description
264 
265 Returns:
266 
267   TODO: add return values
268 
269 --*/
270 ;
271 
272 EFI_STATUS
273 EFIAPI
274 WinNtBlockIoResetBlock (
275   IN EFI_BLOCK_IO_PROTOCOL  *This,
276   IN BOOLEAN                ExtendedVerification
277   )
278 /*++
279 
280 Routine Description:
281 
282   TODO: Add function description
283 
284 Arguments:
285 
286   This                  - TODO: add argument description
287   ExtendedVerification  - TODO: add argument description
288 
289 Returns:
290 
291   TODO: add return values
292 
293 --*/
294 ;
295 
296 //
297 // Private Worker functions
298 //
299 EFI_STATUS
300 WinNtBlockIoCreateMapping (
301   IN EFI_WIN_NT_IO_PROTOCOL             *WinNtIo,
302   IN EFI_HANDLE                         EfiDeviceHandle,
303   IN CHAR16                             *Filename,
304   IN BOOLEAN                            ReadOnly,
305   IN BOOLEAN                            RemovableMedia,
306   IN UINTN                              NumberOfBlocks,
307   IN UINTN                              BlockSize,
308   IN WIN_NT_RAW_DISK_DEVICE_TYPE        DeviceType
309   )
310 /*++
311 
312 Routine Description:
313 
314   TODO: Add function description
315 
316 Arguments:
317 
318   WinNtIo         - TODO: add argument description
319   EfiDeviceHandle - TODO: add argument description
320   Filename        - TODO: add argument description
321   ReadOnly        - TODO: add argument description
322   RemovableMedia  - TODO: add argument description
323   NumberOfBlocks  - TODO: add argument description
324   BlockSize       - TODO: add argument description
325   DeviceType      - TODO: add argument description
326 
327 Returns:
328 
329   TODO: add return values
330 
331 --*/
332 ;
333 
334 EFI_STATUS
335 WinNtBlockIoReadWriteCommon (
336   IN  WIN_NT_BLOCK_IO_PRIVATE *Private,
337   IN UINT32                   MediaId,
338   IN EFI_LBA                  Lba,
339   IN UINTN                    BufferSize,
340   IN VOID                     *Buffer,
341   IN CHAR8                    *CallerName
342   )
343 /*++
344 
345 Routine Description:
346 
347   TODO: Add function description
348 
349 Arguments:
350 
351   Private     - TODO: add argument description
352   MediaId     - TODO: add argument description
353   Lba         - TODO: add argument description
354   BufferSize  - TODO: add argument description
355   Buffer      - TODO: add argument description
356   CallerName  - TODO: add argument description
357 
358 Returns:
359 
360   TODO: add return values
361 
362 --*/
363 ;
364 
365 EFI_STATUS
366 WinNtBlockIoError (
367   IN WIN_NT_BLOCK_IO_PRIVATE      *Private
368   )
369 /*++
370 
371 Routine Description:
372 
373   TODO: Add function description
374 
375 Arguments:
376 
377   Private - TODO: add argument description
378 
379 Returns:
380 
381   TODO: add return values
382 
383 --*/
384 ;
385 
386 EFI_STATUS
387 WinNtBlockIoOpenDevice (
388   WIN_NT_BLOCK_IO_PRIVATE         *Private
389   )
390 /*++
391 
392 Routine Description:
393 
394   TODO: Add function description
395 
396 Arguments:
397 
398   Private - TODO: add argument description
399 
400 Returns:
401 
402   TODO: add return values
403 
404 --*/
405 ;
406 
407 CHAR16                                    *
408 GetNextElementPastTerminator (
409   IN  CHAR16  *EnvironmentVariable,
410   IN  CHAR16  Terminator
411   )
412 /*++
413 
414 Routine Description:
415 
416   TODO: Add function description
417 
418 Arguments:
419 
420   EnvironmentVariable - TODO: add argument description
421   Terminator          - TODO: add argument description
422 
423 Returns:
424 
425   TODO: add return values
426 
427 --*/
428 ;
429 
430 
431 
432 EFI_STATUS
433 SetFilePointer64 (
434   IN  WIN_NT_BLOCK_IO_PRIVATE    *Private,
435   IN  INT64                      DistanceToMove,
436   OUT UINT64                     *NewFilePointer,
437   IN  DWORD                      MoveMethod
438   )
439 /*++
440 
441 Routine Description:
442 
443   TODO: Add function description
444 
445 Arguments:
446 
447   Private         - TODO: add argument description
448   DistanceToMove  - TODO: add argument description
449   NewFilePointer  - TODO: add argument description
450   MoveMethod      - TODO: add argument description
451 
452 Returns:
453 
454   TODO: add return values
455 
456 --*/
457 ;
458 
459 UINTN
460 Atoi (
461   CHAR16  *String
462   )
463 /*++
464 
465 Routine Description:
466 
467   TODO: Add function description
468 
469 Arguments:
470 
471   String  - TODO: add argument description
472 
473 Returns:
474 
475   TODO: add return values
476 
477 --*/
478 ;
479 
480 #endif
481