[disk] Introduce I/O function prototype without...
[people/sha0/winvblock.git] / src / include / disk.h
1 /**
2  * Copyright (C) 2009-2011, Shao Miller <shao.miller@yrdsb.edu.on.ca>.
3  * Copyright 2006-2008, V.
4  * For WinAoE contact information, see http://winaoe.org/
5  *
6  * This file is part of WinVBlock, derived from WinAoE.
7  *
8  * WinVBlock is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * WinVBlock is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with WinVBlock.  If not, see <http://www.gnu.org/licenses/>.
20  */
21 #ifndef WV_M_DISK_H_
22 #  define WV_M_DISK_H_
23
24 /**
25  * @file
26  *
27  * Disk device specifics.
28  */
29
30 typedef enum WVL_DISK_MEDIA_TYPE {
31     WvlDiskMediaTypeFloppy,
32     WvlDiskMediaTypeHard,
33     WvlDiskMediaTypeOptical,
34     WvlDiskMediaTypes
35   } WVL_E_DISK_MEDIA_TYPE, * WVL_EP_DISK_MEDIA_TYPE;
36
37 typedef char WVL_A_DISK_BOOT_SECT[512];
38 typedef WVL_A_DISK_BOOT_SECT * WVL_AP_DISK_BOOT_SECT;
39
40 extern BOOLEAN WvDiskIsRemovable[WvlDiskMediaTypes];
41 extern PWCHAR WvDiskCompatIds[WvlDiskMediaTypes];
42
43 typedef enum WVL_DISK_IO_MODE {
44     WvlDiskIoModeRead,
45     WvlDiskIoModeWrite,
46     WvlDiskIoModes
47   } WVL_E_DISK_IO_MODE, * WVL_EP_DISK_IO_MODE;
48
49 /* Forward declaration. */
50 typedef struct WV_DISK_T WV_S_DISK_T, * WV_SP_DISK_T;
51
52 /**
53  * I/O Request.
54  *
55  * @v disk              Points to the disk's structure.
56  * @v mode              Read/write mode.
57  * @v start_sector      First sector for request.
58  * @v sector_count      Number of sectors to work with.
59  * @v buffer            Buffer to read/write sectors to/from.
60  * @v irp               Interrupt request packet for this request.
61  */
62 typedef NTSTATUS STDCALL WVL_F_DISK_IO(
63     IN WV_SP_DISK_T,
64     IN WVL_E_DISK_IO_MODE,
65     IN LONGLONG,
66     IN UINT32,
67     IN PUCHAR,
68     IN PIRP
69   );
70 typedef WVL_F_DISK_IO * WVL_FP_DISK_IO;
71
72 /**
73  * I/O Request.
74  *
75  * @v dev_ptr           Points to the disk's device structure.
76  * @v mode              Read / write mode.
77  * @v start_sector      First sector for request.
78  * @v sector_count      Number of sectors to work with.
79  * @v buffer            Buffer to read / write sectors to / from.
80  * @v irp               Interrupt request packet for this request.
81  */
82 typedef NTSTATUS STDCALL WV_F_DISK_IO(
83     IN WV_SP_DEV_T,
84     IN WVL_E_DISK_IO_MODE,
85     IN LONGLONG,
86     IN UINT32,
87     IN PUCHAR,
88     IN PIRP
89   );
90 typedef WV_F_DISK_IO * WV_FP_DISK_IO;
91
92 /**
93  * Maximum transfer length response routine.
94  *
95  * @v disk_ptr        The disk being queried.
96  * @ret UINT32        The maximum transfer length.
97  */
98 typedef UINT32 WV_F_DISK_MAX_XFER_LEN(IN WV_SP_DISK_T);
99 typedef WV_F_DISK_MAX_XFER_LEN * WV_FP_DISK_MAX_XFER_LEN;
100
101 /**
102  * Disk initialization routine.
103  *
104  * @v disk_ptr        The disk device being initialized.
105  * @ret BOOLEAN       FALSE if initialization failed, otherwise TRUE
106  */
107 typedef BOOLEAN STDCALL WV_F_DISK_INIT(IN WV_SP_DISK_T);
108 typedef WV_F_DISK_INIT * WV_FP_DISK_INIT;
109
110 /**
111  * Disk close routine.
112  *
113  * @v disk_ptr        The disk device being closed.
114  */
115 typedef VOID STDCALL WV_F_DISK_CLOSE(IN WV_SP_DISK_T);
116 typedef WV_F_DISK_CLOSE * WV_FP_DISK_CLOSE;
117
118 /**
119  * Fetch disk unit number routine.
120  *
121  * @v disk              The disk whose unit number is fetched.
122  * @ret UCHAR           The disk's unit number.
123  */
124 typedef UCHAR STDCALL WVL_F_DISK_UNIT_NUM(IN WV_SP_DISK_T);
125 typedef WVL_F_DISK_UNIT_NUM * WVL_FP_DISK_UNIT_NUM;
126 extern WVL_M_LIB WVL_F_DISK_UNIT_NUM WvlDiskUnitNum;
127
128 typedef struct WV_DISK_OPS {
129     WV_FP_DISK_IO Io;
130     WV_FP_DISK_MAX_XFER_LEN MaxXferLen;
131     WV_FP_DISK_INIT Init;
132     WV_FP_DISK_CLOSE Close;
133     WVL_FP_DISK_UNIT_NUM UnitNum;
134   } WV_S_DISK_OPS, * WV_SP_DISK_OPS;
135
136 struct WV_DISK_T {
137     WV_S_DEV_T Dev[1];
138     KEVENT SearchEvent;
139     KSPIN_LOCK SpinLock;
140     WVL_E_DISK_MEDIA_TYPE Media;
141     WV_S_DISK_OPS disk_ops;
142     ULONGLONG LBADiskSize;
143     ULONGLONG Cylinders;
144     UINT32 Heads;
145     UINT32 Sectors;
146     UINT32 SectorSize;
147     UINT32 SpecialFileCount;
148     LIST_ENTRY tracking;
149     PVOID ext;
150     PDRIVER_OBJECT DriverObj;
151   };
152
153 /* Yield a pointer to the disk. */
154 #define disk__get_ptr(dev_ptr) ((WV_SP_DISK_T) dev_ptr->ext)
155
156 /* An MBR C/H/S address and ways to access its components. */
157 typedef UCHAR chs[3];
158
159 #define     chs_head(chs) chs[0]
160 #define   chs_sector(chs) (chs[1] & 0x3F)
161 #define chs_cyl_high(chs) (((UINT16) (chs[1] & 0xC0)) << 2)
162 #define  chs_cyl_low(chs) ((UINT16) chs[2])
163 #define chs_cylinder(chs) (chs_cyl_high(chs) | chs_cyl_low(chs))
164
165 /* An MBR. */
166 #ifdef _MSC_VER
167 #  pragma pack(1)
168 #endif
169 struct WVL_DISK_MBR {
170     UCHAR code[440];
171     UINT32 disk_sig;
172     UINT16 pad;
173     struct {
174         UCHAR status;
175         chs chs_start;
176         UCHAR type;
177         chs chs_end;
178         UINT32 lba_start;
179         UINT32 lba_count;
180       } partition[4] __attribute__((packed));
181     UINT16 mbr_sig;
182   } __attribute__((__packed__));
183 typedef struct WVL_DISK_MBR WVL_S_DISK_MBR, * WVL_SP_DISK_MBR;
184 #ifdef _MSC_VER
185 #  pragma pack()
186 #endif
187
188 extern WV_F_DISK_IO disk__io;
189 extern WV_F_DISK_MAX_XFER_LEN disk__max_xfer_len;
190
191 /**
192  * Attempt to guess a disk's geometry.
193  *
194  * @v boot_sect_ptr     The MBR or VBR with possible geometry clues.
195  * @v disk_ptr          The disk to set the geometry for.
196  */
197 extern WVL_M_LIB VOID disk__guess_geometry(
198     IN WVL_AP_DISK_BOOT_SECT,
199     IN OUT WV_SP_DISK_T disk_ptr
200   );
201
202 extern WVL_M_LIB NTSTATUS STDCALL WvlDiskCreatePdo(
203     IN PDRIVER_OBJECT,
204     IN SIZE_T,
205     IN WVL_E_DISK_MEDIA_TYPE,
206     OUT PDEVICE_OBJECT *
207   );
208 extern WVL_M_LIB VOID STDCALL WvDiskInit(IN WV_SP_DISK_T);
209
210 /* IRP-related. */
211 extern WVL_M_LIB WV_F_DEV_DISPATCH WvDiskIrpPower;
212 extern WVL_M_LIB WV_F_DEV_DISPATCH WvDiskIrpSysCtl;
213 /* IRP_MJ_DEVICE_CONTROL dispatcher from disk/dev_ctl.c */
214 extern WVL_M_LIB NTSTATUS STDCALL WvlDiskDevCtl(
215     IN WV_SP_DISK_T,
216     IN PIRP,
217     IN ULONG POINTER_ALIGNMENT
218   );
219 /* IRP_MJ_SCSI dispatcher from disk/scsi.c */
220 extern WVL_M_LIB WV_F_DEV_SCSI disk_scsi__dispatch;
221 /* IRP_MJ_PNP dispatcher from disk/pnp.c */
222 extern WVL_M_LIB WV_F_DEV_PNP disk_pnp__dispatch;
223
224
225 #endif  /* WV_M_DISK_H_ */