4 * Driver Development Kit -- Disk IOCTL interface.
6 * Written by Casper S. Hornstrup <chorns@users.sourceforge.net>
7 * Copyright (C) 2002-2004, 2015, 2016, MinGW.org Project.
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
17 * The above copyright notice, this permission notice, and the following
18 * disclaimer shall be included in all copies or substantial portions of
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OR OTHER
27 * DEALINGS IN THE SOFTWARE.
30 #ifndef _DDK_NTDDDISK_H
31 #pragma GCC system_header
33 /* This file supports partial inclusion by <winioctl.h>; defer definition
34 * of its normal repeat inclusion guard macro...
36 #ifndef __WINIOCTL_H_SOURCED__
37 /* ...until we've ascertained that this is NOT such partial inclusion.
39 #define _DDK_NTDDDISK_H
41 /* In case of full inclusion, we must also include the full content of:
46 /* In either case, we always include <ddk/ntddstor.h>, either in full,
47 * or under the same criterion of selectivity as for this file itself.
51 #if ! (defined _DDK_NTDDDISK_H && defined _WINIOCTL_H)
52 /* The content of this section is common to both <ddk/ntdddisk.h> and
53 * <winioctl.h>. If both repeat inclusion guards are already defined,
54 * then we've already seen it; there is no need to process it again.
56 #define __IOCTL_DISK_(FN,M,A) CTL_CODE(IOCTL_DISK_BASE,(FN),(M),(A))
58 #define IOCTL_DISK_BASE FILE_DEVICE_DISK
59 #define IOCTL_DISK_GET_DRIVE_GEOMETRY __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0000)
60 #define IOCTL_DISK_GET_PARTITION_INFO __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0001)
61 #define IOCTL_DISK_SET_PARTITION_INFO __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0002)
62 #define IOCTL_DISK_GET_DRIVE_LAYOUT __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0003)
63 #define IOCTL_DISK_SET_DRIVE_LAYOUT __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0004)
64 #define IOCTL_DISK_VERIFY __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0005)
65 #define IOCTL_DISK_FORMAT_TRACKS __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0006)
66 #define IOCTL_DISK_REASSIGN_BLOCKS __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0007)
67 #define IOCTL_DISK_PERFORMANCE __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0008)
68 #define IOCTL_DISK_IS_WRITABLE __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0009)
69 #define IOCTL_DISK_FORMAT_TRACKS_EX __FILE_RW_BUFFERED(__IOCTL_DISK_,0x000B)
70 #define IOCTL_DISK_GET_PARTITION_INFO_EX __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0012)
71 #define IOCTL_DISK_SET_PARTITION_INFO_EX __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0013)
72 #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0014)
73 #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0015)
74 #define IOCTL_DISK_CREATE_DISK __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0016)
75 #define IOCTL_DISK_GET_LENGTH_INFO __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0017)
76 #define IOCTL_DISK_PERFORMANCE_OFF __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0018)
77 #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0028)
78 #define IOCTL_DISK_UPDATE_DRIVE_SIZE __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0032)
79 #define IOCTL_DISK_GROW_PARTITION __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0034)
80 #define IOCTL_DISK_GET_CACHE_INFORMATION __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0035)
81 #define IOCTL_DISK_SET_CACHE_INFORMATION __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0036)
82 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0040)
83 #define IOCTL_DISK_CHECK_VERIFY __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0200)
84 #define IOCTL_DISK_RESERVE __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0204)
85 #define IOCTL_DISK_FIND_NEW_DEVICES __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0206)
86 #define IOCTL_DISK_GET_MEDIA_TYPES __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0300)
89 { PARTITION_ENTRY_UNUSED = 0x00,
90 PARTITION_FAT_12 = 0x01,
91 PARTITION_XENIX_1 = 0x02,
92 PARTITION_XENIX_2 = 0x03,
93 PARTITION_FAT_16 = 0x04,
94 PARTITION_EXTENDED = 0x05,
95 PARTITION_HUGE = 0x06,
97 PARTITION_OS2BOOTMGR = 0x0A,
98 PARTITION_FAT32 = 0x0B,
99 PARTITION_FAT32_XINT13 = 0x0C,
100 PARTITION_XINT13 = 0x0E,
101 PARTITION_XINT13_EXTENDED = 0x0F,
102 PARTITION_PREP = 0x41,
103 PARTITION_LDM = 0x42,
104 PARTITION_UNIX = 0x63,
105 PARTITION_NTFT = 0x80,
109 #define IsRecognizedPartition( TYPE ) \
110 ( (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_FAT_12))\
111 || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_HUGE))\
112 || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_IFS))\
113 || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_FAT32))\
114 || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_FAT32_XINT13))\
115 || (((TYPE) & PARTITION_NTFT) && (((TYPE) & ~VALID_NTFT) == PARTITION_XINT13))\
116 || ((TYPE) == PARTITION_FAT32) || ((TYPE) == PARTITION_FAT32_XINT13)\
117 || ((TYPE) == PARTITION_FAT_12) || ((TYPE) == PARTITION_FAT_16)\
118 || ((TYPE) == PARTITION_HUGE) || ((TYPE) == PARTITION_IFS)\
119 || ((TYPE) == PARTITION_XINT13)\
121 #define IsContainerPartition( TYPE ) \
122 (((TYPE) == PARTITION_EXTENDED) || ((TYPE) == PARTITION_XINT13_EXTENDED))
126 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff562216(v=vs.85).aspx */
138 RemovableMedia = 0x0B,
145 F3_1Pt23_1024 = 0x12,
146 F5_1Pt23_1024 = 0x13,
153 } MEDIA_TYPE, *PMEDIA_TYPE;
157 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552516%28v=vs.85%29.aspx */
164 struct _DISK_INT13_INFO
165 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552624(v=vs.85).aspx */
166 { USHORT DriveSelect;
168 USHORT SectorsPerTrack;
171 } DISK_INT13_INFO, *PDISK_INT13_INFO;
174 struct _DISK_EX_INT13_INFO
175 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552610(v=vs.85).aspx */
176 { USHORT ExBufferSize;
180 ULONG ExSectorsPerTrack;
181 ULONG64 ExSectorsPerDrive;
184 } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
187 struct _DISK_DETECTION_INFO
188 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552601(v=vs.85).aspx */
189 { ULONG SizeOfDetectInfo;
190 DETECTION_TYPE DetectionType;
191 _ANONYMOUS_UNION union
192 { _ANONYMOUS_STRUCT struct
193 { DISK_INT13_INFO Int13;
194 DISK_EX_INT13_INFO ExInt13;
197 } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
200 struct _DISK_GEOMETRY
201 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552613(v=vs.85).aspx */
202 { LARGE_INTEGER Cylinders;
203 MEDIA_TYPE MediaType;
204 ULONG TracksPerCylinder;
205 ULONG SectorsPerTrack;
206 ULONG BytesPerSector;
207 } DISK_GEOMETRY, *PDISK_GEOMETRY;
210 struct _DISK_GEOMETRY_EX
211 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552618(v=vs.85).aspx */
212 { DISK_GEOMETRY Geometry;
213 LARGE_INTEGER DiskSize;
215 } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
217 /* Note: although declared as an array of only one byte, the Data area within
218 * the DISK_GEOMETRY_EX structure represents a variable size region containing
219 * a DISK_PARTITION_INFO structure followed by a DISK_DETECTION_INFO structure;
220 * the above <ddk/ntdddisk.h> reference defines the following pair of macros,
221 * for obtaining pointers to the embedded structures, given a pointer to the
222 * containing DISK_GEOMETRY_EX structure itself; (the corresponding reference
223 * for <winioctl.h> refers to these macros, without defining them).
225 #if NTDDI_VERSION < NTDDI_WS03
226 /* FIXME: given the above definition for DISK_GEOMETRY_EX, this pair of
227 * macro definitions makes no sense at all...
229 # define DiskGeometryGetPartition(Geometry) \
230 ((PDISK_PARTITION_INFO)((Geometry) + 1))
232 # define DiskGeometryGetDetect(Geometry) \
233 ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
234 DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
236 /* ...whereas this pair would seem to be appropriate, regardless of the
237 * underlying NTDDI_VERSION.
239 # define DiskGeometryGetPartition(Geometry) \
240 ((PDISK_PARTITION_INFO)((Geometry)->Data))
242 # define DiskGeometryGetDetect(Geometry) \
243 ((PDISK_DETECTION_INFO)(((ULONG_PTR)DiskGeometryGetPartition(Geometry) + \
244 DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
248 struct _PARTITION_INFORMATION
249 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563751(v=vs.85).aspx */
250 { LARGE_INTEGER StartingOffset;
251 LARGE_INTEGER PartitionLength;
253 ULONG PartitionNumber;
255 BOOLEAN BootIndicator;
256 BOOLEAN RecognizedPartition;
257 BOOLEAN RewritePartition;
258 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
261 struct _PARTITION_INFORMATION_GPT
262 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563763(v=vs.85).aspx */
263 { GUID PartitionType;
267 } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
270 struct _DISK_PARTITION_INFO
271 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552629(v=vs.85).aspx */
272 { ULONG SizeOfPartitionInfo;
273 PARTITION_STYLE PartitionStyle;
274 _ANONYMOUS_UNION union
283 } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
286 struct _DISK_PERFORMANCE
287 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552633(v=vs.85).aspx */
288 { LARGE_INTEGER BytesRead;
289 LARGE_INTEGER BytesWritten;
290 LARGE_INTEGER ReadTime;
291 LARGE_INTEGER WriteTime;
292 LARGE_INTEGER IdleTime;
297 LARGE_INTEGER QueryTime;
298 ULONG StorageDeviceNumber;
299 WCHAR StorageManagerName[8];
300 } DISK_PERFORMANCE, *PDISK_PERFORMANCE;
303 struct _PARTITION_INFORMATION_EX
304 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563754(v=vs.85).aspx */
305 { PARTITION_STYLE PartitionStyle;
306 LARGE_INTEGER StartingOffset;
307 LARGE_INTEGER PartitionLength;
308 ULONG PartitionNumber;
309 BOOLEAN RewritePartition;
310 _ANONYMOUS_UNION union
311 { PARTITION_INFORMATION_MBR Mbr;
312 PARTITION_INFORMATION_GPT Gpt;
314 } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
317 struct _FORMAT_EX_PARAMETERS
318 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff553875(v=vs.85).aspx */
319 { MEDIA_TYPE MediaType;
320 ULONG StartCylinderNumber;
321 ULONG EndCylinderNumber;
322 ULONG StartHeadNumber;
324 USHORT FormatGapLength;
325 USHORT SectorsPerTrack;
326 USHORT SectorNumber[1];
327 } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
330 struct _FORMAT_PARAMETERS
331 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff553878(v=vs.85).aspx */
332 { MEDIA_TYPE MediaType;
333 ULONG StartCylinderNumber;
334 ULONG EndCylinderNumber;
335 ULONG StartHeadNumber;
337 } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
340 struct _GET_LENGTH_INFORMATION
341 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff554986(v=vs.85).aspx */
342 { LARGE_INTEGER Length;
343 } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
346 struct _REASSIGN_BLOCKS
347 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff563962(v=vs.85).aspx */
350 ULONG BlockNumber[1];
351 } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
354 struct _SET_PARTITION_INFORMATION
355 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff566192(v=vs.85).aspx */
356 { UCHAR PartitionType;
357 } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
360 struct _VERIFY_INFORMATION
361 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff568005(v=vs.85).aspx */
362 { LARGE_INTEGER StartingOffset;
364 } VERIFY_INFORMATION, *PVERIFY_INFORMATION;
367 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552583(v=vs.85).aspx */
369 KeepPrefetchedData = 1,
371 } DISK_CACHE_RETENTION_PRIORITY;
374 struct _DISK_CACHE_INFORMATION
375 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552580(v=vs.85).aspx */
376 { BOOLEAN ParametersSavable;
377 BOOLEAN ReadCacheEnabled;
378 BOOLEAN WriteCacheEnabled;
379 DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
380 DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
381 USHORT DisablePrefetchTransferLength;
382 BOOLEAN PrefetchScalar;
383 _ANONYMOUS_UNION union
387 USHORT MaximumBlocks;
394 } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
397 struct _DISK_GROW_PARTITION
398 /* https://msdn.microsoft.com/en-us/library/windows/hardware/ff552621(v=vs.85).aspx */
399 { ULONG PartitionNumber;
400 LARGE_INTEGER BytesToGrow;
401 } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
403 /* End of _DDK_NTDDDISK_H and _WINIOCTL_H common declarations.
406 #ifdef _DDK_NTDDDISK_H
407 /* Declarations specific to _DDK_NTDDDISK_H alone.
411 #define DD_DISK_DEVICE_NAME "\\Device\\UNKNOWN"
412 #define DD_DISK_DEVICE_NAME_U L"\\Device\\UNKNOWN"
414 #define IOCTL_DISK_CONTROLLER_NUMBER __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0011)
415 #define IOCTL_DISK_INTERNAL_SET_VERIFY __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0100)
416 #define IOCTL_DISK_INTERNAL_CLEAR_VERIFY __FILE_AM_BUFFERED(__IOCTL_DISK_,0x0101)
418 #define SMART_GET_VERSION __FILE_RD_BUFFERED(__IOCTL_DISK_,0x0020)
419 #define SMART_RCV_DRIVE_DATA __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0022)
420 #define SMART_SEND_DRIVE_COMMAND __FILE_RW_BUFFERED(__IOCTL_DISK_,0x0021)
422 #define IsFTPartition( PartitionType ) \
423 (((PartitionType) & PARTITION_NTFT) && IsRecognizedPartition(PartitionType))
425 DEFINE_GUID( WMI_DISK_GEOMETRY_GUID,
426 0x25007f51L, 0x57c2, 0x11d1, 0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10
429 typedef USHORT BAD_TRACK_NUMBER;
430 typedef USHORT *PBAD_TRACK_NUMBER;
433 struct _DISK_CONTROLLER_NUMBER
434 { ULONG ControllerNumber;
436 } DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
438 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
439 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
442 struct _SET_PARTITION_INFORMATION_EX
443 { PARTITION_STYLE PartitionStyle;
444 _ANONYMOUS_UNION union
445 { SET_PARTITION_INFORMATION_MBR Mbr;
446 SET_PARTITION_INFORMATION_GPT Gpt;
448 } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
450 /* GETVERSIONINPARAMS.fCapabilities constants
452 #define CAP_ATA_ID_CMD 1
453 #define CAP_ATAPI_ID_CMD 2
454 #define CAP_SMART_CMD 4
457 struct _GETVERSIONINPARAMS
464 } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
466 /* IDEREGS.bCommandReg constants
468 #define ATAPI_ID_CMD 0xA1
470 #define SMART_CMD 0xB0
472 #define SMART_CYL_LOW 0x4F
473 #define SMART_CYL_HI 0xC2
477 { UCHAR bFeaturesReg;
478 UCHAR bSectorCountReg;
479 UCHAR bSectorNumberReg;
485 } IDEREGS, *PIDEREGS, *LPIDEREGS;
487 #include <pshpack1.h>
489 struct _SENDCMDINPARAMS
496 } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
499 /* DRIVERSTATUS.bDriverError constants
501 #define SMART_NO_ERROR 0
502 #define SMART_IDE_ERROR 1
503 #define SMART_INVALID_FLAG 2
504 #define SMART_INVALID_COMMAND 3
505 #define SMART_INVALID_BUFFER 4
506 #define SMART_INVALID_DRIVE 5
507 #define SMART_INVALID_IOCTL 6
508 #define SMART_ERROR_NO_MEM 7
509 #define SMART_INVALID_REGISTER 8
510 #define SMART_NOT_SUPPORTED 9
511 #define SMART_NO_IDE_DEVICE 10
513 #define SMART_OFFLINE_ROUTINE_OFFLINE 0
514 #define SMART_SHORT_SELFTEST_OFFLINE 1
515 #define SMART_EXTENDED_SELFTEST_OFFLINE 2
516 #define SMART_ABORT_OFFLINE_SELFTEST 127
517 #define SMART_SHORT_SELFTEST_CAPTIVE 129
518 #define SMART_EXTENDED_SELFTEST_CAPTIVE 130
522 { UCHAR bDriverError;
526 } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
528 #define READ_ATTRIBUTE_BUFFER_SIZE 512
529 #define IDENTIFY_BUFFER_SIZE 512
530 #define READ_THRESHOLD_BUFFER_SIZE 512
531 #define SMART_LOG_SECTOR_SIZE 512
533 #include <pshpack1.h>
535 struct _SENDCMDOUTPARAMS
537 DRIVERSTATUS DriverStatus;
539 } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
542 #define READ_ATTRIBUTES 0xD0
543 #define READ_THRESHOLDS 0xD1
544 #define ENABLE_DISABLE_AUTOSAVE 0xD2
545 #define SAVE_ATTRIBUTE_VALUES 0xD3
546 #define EXECUTE_OFFLINE_DIAGS 0xD4
547 #define SMART_READ_LOG 0xD5
548 #define SMART_WRITE_LOG 0xd6
549 #define ENABLE_SMART 0xD8
550 #define DISABLE_SMART 0xD9
551 #define RETURN_SMART_STATUS 0xDA
552 #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB
556 #endif /* _DDK_NTDDDISK_H */
557 #endif /* !_DDK_NTDDDISK_H: $RCSfile$: end of file */