Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasimir666 <casimir666@users.sourceforge.net>2006-06-25 00:30:43 +0400
committerCasimir666 <casimir666@users.sourceforge.net>2006-06-25 00:30:43 +0400
commiteebfbbfc59746249c15ddc3de54caaae8a5d8ca7 (patch)
tree35d201f305ded0abee549282583e2226eb8f28bf /include/winddk
parent49e6ef9fd5ee627996aeb71e08e6014e75beeec4 (diff)
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@11 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'include/winddk')
-rw-r--r--include/winddk/devioctl.h145
-rw-r--r--include/winddk/ntddcdrm.h548
-rw-r--r--include/winddk/ntddcdvd.h294
-rw-r--r--include/winddk/ntdddisk.h1217
-rw-r--r--include/winddk/ntddstor.h748
5 files changed, 2952 insertions, 0 deletions
diff --git a/include/winddk/devioctl.h b/include/winddk/devioctl.h
new file mode 100644
index 000000000..b8798266e
--- /dev/null
+++ b/include/winddk/devioctl.h
@@ -0,0 +1,145 @@
+/*++ BUILD Version: 0004 // Increment this if a change has global effects
+
+Copyright (c) 1992-1999 Microsoft Corporation
+
+Module Name:
+
+ devioctl.h
+
+Abstract:
+
+ This module contains
+
+Author:
+
+ Andre Vachon (andreva) 21-Feb-1992
+
+
+Revision History:
+
+
+--*/
+
+// begin_winioctl
+
+#ifndef _DEVIOCTL_
+#define _DEVIOCTL_
+
+// begin_ntddk begin_wdm begin_nthal begin_ntifs
+//
+// Define the various device type values. Note that values used by Microsoft
+// Corporation are in the range 0-32767, and 32768-65535 are reserved for use
+// by customers.
+//
+
+#define DEVICE_TYPE ULONG
+
+#define FILE_DEVICE_BEEP 0x00000001
+#define FILE_DEVICE_CD_ROM 0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
+#define FILE_DEVICE_CONTROLLER 0x00000004
+#define FILE_DEVICE_DATALINK 0x00000005
+#define FILE_DEVICE_DFS 0x00000006
+#define FILE_DEVICE_DISK 0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
+#define FILE_DEVICE_FILE_SYSTEM 0x00000009
+#define FILE_DEVICE_INPORT_PORT 0x0000000a
+#define FILE_DEVICE_KEYBOARD 0x0000000b
+#define FILE_DEVICE_MAILSLOT 0x0000000c
+#define FILE_DEVICE_MIDI_IN 0x0000000d
+#define FILE_DEVICE_MIDI_OUT 0x0000000e
+#define FILE_DEVICE_MOUSE 0x0000000f
+#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
+#define FILE_DEVICE_NAMED_PIPE 0x00000011
+#define FILE_DEVICE_NETWORK 0x00000012
+#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
+#define FILE_DEVICE_NULL 0x00000015
+#define FILE_DEVICE_PARALLEL_PORT 0x00000016
+#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
+#define FILE_DEVICE_PRINTER 0x00000018
+#define FILE_DEVICE_SCANNER 0x00000019
+#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
+#define FILE_DEVICE_SERIAL_PORT 0x0000001b
+#define FILE_DEVICE_SCREEN 0x0000001c
+#define FILE_DEVICE_SOUND 0x0000001d
+#define FILE_DEVICE_STREAMS 0x0000001e
+#define FILE_DEVICE_TAPE 0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
+#define FILE_DEVICE_TRANSPORT 0x00000021
+#define FILE_DEVICE_UNKNOWN 0x00000022
+#define FILE_DEVICE_VIDEO 0x00000023
+#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
+#define FILE_DEVICE_WAVE_IN 0x00000025
+#define FILE_DEVICE_WAVE_OUT 0x00000026
+#define FILE_DEVICE_8042_PORT 0x00000027
+#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
+#define FILE_DEVICE_BATTERY 0x00000029
+#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
+#define FILE_DEVICE_MODEM 0x0000002b
+#define FILE_DEVICE_VDM 0x0000002c
+#define FILE_DEVICE_MASS_STORAGE 0x0000002d
+#define FILE_DEVICE_SMB 0x0000002e
+#define FILE_DEVICE_KS 0x0000002f
+#define FILE_DEVICE_CHANGER 0x00000030
+#define FILE_DEVICE_SMARTCARD 0x00000031
+#define FILE_DEVICE_ACPI 0x00000032
+#define FILE_DEVICE_DVD 0x00000033
+#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
+#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
+#define FILE_DEVICE_DFS_VOLUME 0x00000036
+#define FILE_DEVICE_SERENUM 0x00000037
+#define FILE_DEVICE_TERMSRV 0x00000038
+#define FILE_DEVICE_KSEC 0x00000039
+#define FILE_DEVICE_FIPS 0x0000003A
+
+//
+// Macro definition for defining IOCTL and FSCTL function control codes. Note
+// that function codes 0-2047 are reserved for Microsoft Corporation, and
+// 2048-4095 are reserved for customers.
+//
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
+ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+//
+// Macro to extract device type out of the device io control code
+//
+#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0xffff0000)) >> 16)
+
+//
+// Define the method codes for how buffers are passed for I/O and FS controls
+//
+
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+
+//
+// Define the access check value for any access
+//
+//
+// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
+// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
+// constants *MUST* always be in sync.
+//
+//
+// FILE_SPECIAL_ACCESS is checked by the NT I/O system the same as FILE_ANY_ACCESS.
+// The file systems, however, may add additional access checks for I/O and FS controls
+// that use this value.
+//
+
+
+#define FILE_ANY_ACCESS 0
+#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS)
+#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe
+#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
+
+// end_ntddk end_wdm end_nthal end_ntifs
+
+#endif // _DEVIOCTL_
+
+// end_winioctl
+
diff --git a/include/winddk/ntddcdrm.h b/include/winddk/ntddcdrm.h
new file mode 100644
index 000000000..6b77f707a
--- /dev/null
+++ b/include/winddk/ntddcdrm.h
@@ -0,0 +1,548 @@
+/*++ BUILD Version: 0001 // Increment this if a change has global effects
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ ntddcdrm.h
+
+Abstract:
+
+ This module contains structures and definitions
+ associated with CDROM IOCTls.
+
+Author:
+
+ Mike Glass
+
+Revision History:
+
+--*/
+
+// begin_winioctl
+
+#ifndef _NTDDCDRM_
+#define _NTDDCDRM_
+
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+//
+// remove some level 4 warnings for this header file:
+#pragma warning(disable:4200) // array[0]
+#pragma warning(disable:4201) // nameless struct/unions
+#pragma warning(disable:4214) // bit fields other than int
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//
+// NtDeviceIoControlFile IoControlCode values for this device.
+//
+// Warning: Remember that the low two bits of the code specify how the
+// buffers are passed to the driver!
+//
+
+#define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
+
+#define IOCTL_CDROM_UNLOAD_DRIVER CTL_CODE(IOCTL_CDROM_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+//
+// CDROM Audio Device Control Functions
+//
+
+#define IOCTL_CDROM_READ_TOC CTL_CODE(IOCTL_CDROM_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_SEEK_AUDIO_MSF CTL_CODE(IOCTL_CDROM_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_STOP_AUDIO CTL_CODE(IOCTL_CDROM_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_PAUSE_AUDIO CTL_CODE(IOCTL_CDROM_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_RESUME_AUDIO CTL_CODE(IOCTL_CDROM_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_GET_VOLUME CTL_CODE(IOCTL_CDROM_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_PLAY_AUDIO_MSF CTL_CODE(IOCTL_CDROM_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_SET_VOLUME CTL_CODE(IOCTL_CDROM_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_READ_Q_CHANNEL CTL_CODE(IOCTL_CDROM_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_GET_CONTROL CTL_CODE(IOCTL_CDROM_BASE, 0x000D, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_GET_LAST_SESSION CTL_CODE(IOCTL_CDROM_BASE, 0x000E, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_RAW_READ CTL_CODE(IOCTL_CDROM_BASE, 0x000F, METHOD_OUT_DIRECT, FILE_READ_ACCESS)
+#define IOCTL_CDROM_DISK_TYPE CTL_CODE(IOCTL_CDROM_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_CDROM_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_CDROM_BASE, 0x0014, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_CDROM_READ_TOC_EX CTL_CODE(IOCTL_CDROM_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_GET_CONFIGURATION CTL_CODE(IOCTL_CDROM_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+// end_winioctl
+
+//
+// The following device control codes are common for all class drivers. The
+// functions codes defined here must match all of the other class drivers.
+//
+// Warning: these codes will be replaced in the future with the IOCTL_STORAGE
+// codes included below
+//
+
+#define IOCTL_CDROM_CHECK_VERIFY CTL_CODE(IOCTL_CDROM_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_MEDIA_REMOVAL CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_EJECT_MEDIA CTL_CODE(IOCTL_CDROM_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_LOAD_MEDIA CTL_CODE(IOCTL_CDROM_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_RESERVE CTL_CODE(IOCTL_CDROM_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_RELEASE CTL_CODE(IOCTL_CDROM_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CDROM_FIND_NEW_DEVICES CTL_CODE(IOCTL_CDROM_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+//
+// The following file contains the IOCTL_STORAGE class ioctl definitions
+//
+
+#include "ntddstor.h"
+
+// begin_winioctl
+
+//
+// The following device control code is for the SIMBAD simulated bad
+// sector facility. See SIMBAD.H in this directory for related structures.
+//
+
+#define IOCTL_CDROM_SIMBAD CTL_CODE(IOCTL_CDROM_BASE, 0x1003, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+//
+// Maximum CD Rom size
+//
+
+#define MAXIMUM_NUMBER_TRACKS 100
+#define MAXIMUM_CDROM_SIZE 804
+#define MINIMUM_CDROM_READ_TOC_EX_SIZE 2 // two bytes min transferred
+
+//
+// READ_TOC_EX structure
+//
+typedef struct _CDROM_READ_TOC_EX {
+ UCHAR Format : 4;
+ UCHAR Reserved1 : 3; // future expansion
+ UCHAR Msf : 1;
+ UCHAR SessionTrack;
+ UCHAR Reserved2; // future expansion
+ UCHAR Reserved3; // future expansion
+} CDROM_READ_TOC_EX, *PCDROM_READ_TOC_EX;
+
+#define CDROM_READ_TOC_EX_FORMAT_TOC 0x00
+#define CDROM_READ_TOC_EX_FORMAT_SESSION 0x01
+#define CDROM_READ_TOC_EX_FORMAT_FULL_TOC 0x02
+#define CDROM_READ_TOC_EX_FORMAT_PMA 0x03
+#define CDROM_READ_TOC_EX_FORMAT_ATIP 0x04
+#define CDROM_READ_TOC_EX_FORMAT_CDTEXT 0x05
+
+//
+// CD ROM Table OF Contents (TOC)
+// Format 0 - Get table of contents
+//
+
+typedef struct _TRACK_DATA {
+ UCHAR Reserved;
+ UCHAR Control : 4;
+ UCHAR Adr : 4;
+ UCHAR TrackNumber;
+ UCHAR Reserved1;
+ UCHAR Address[4];
+} TRACK_DATA, *PTRACK_DATA;
+
+typedef struct _CDROM_TOC {
+
+ //
+ // Header
+ //
+
+ UCHAR Length[2]; // add two bytes for this field
+ UCHAR FirstTrack;
+ UCHAR LastTrack;
+
+ //
+ // Track data
+ //
+
+ TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
+} CDROM_TOC, *PCDROM_TOC;
+
+#define CDROM_TOC_SIZE sizeof(CDROM_TOC)
+
+//
+// CD ROM Table OF Contents
+// Format 1 - Session Information
+//
+
+typedef struct _CDROM_TOC_SESSION_DATA {
+
+ //
+ // Header
+ //
+
+ UCHAR Length[2]; // add two bytes for this field
+ UCHAR FirstCompleteSession;
+ UCHAR LastCompleteSession;
+
+ //
+ // One track, representing the first track
+ // of the last finished session
+ //
+
+ TRACK_DATA TrackData[1];
+
+} CDROM_TOC_SESSION_DATA, *PCDROM_TOC_SESSION_DATA;
+
+
+//
+// CD ROM Table OF Contents
+// Format 2 - Full TOC
+//
+
+typedef struct _CDROM_TOC_FULL_TOC_DATA_BLOCK {
+ UCHAR SessionNumber;
+ UCHAR Control : 4;
+ UCHAR Adr : 4;
+ UCHAR Reserved1;
+ UCHAR Point;
+ UCHAR MsfExtra[3];
+ UCHAR Zero;
+ UCHAR Msf[3];
+} CDROM_TOC_FULL_TOC_DATA_BLOCK, *PCDROM_TOC_FULL_TOC_DATA_BLOCK;
+
+typedef struct _CDROM_TOC_FULL_TOC_DATA {
+
+ //
+ // Header
+ //
+
+ UCHAR Length[2]; // add two bytes for this field
+ UCHAR FirstCompleteSession;
+ UCHAR LastCompleteSession;
+
+ //
+ // one to N descriptors included
+ //
+
+ CDROM_TOC_FULL_TOC_DATA_BLOCK Descriptors[0];
+
+} CDROM_TOC_FULL_TOC_DATA, *PCDROM_TOC_FULL_TOC_DATA;
+
+//
+// CD ROM Table OF Contents
+// Format 3 - Program Memory Area
+//
+typedef struct _CDROM_TOC_PMA_DATA {
+
+ //
+ // Header
+ //
+
+ UCHAR Length[2]; // add two bytes for this field
+ UCHAR Reserved1;
+ UCHAR Reserved2;
+
+ //
+ // one to N descriptors included
+ //
+
+ CDROM_TOC_FULL_TOC_DATA_BLOCK Descriptors[0];
+
+} CDROM_TOC_PMA_DATA, *PCDROM_TOC_PMA_DATA;
+
+//
+// CD ROM Table OF Contents
+// Format 4 - Absolute Time In Pregroove
+//
+
+typedef struct _CDROM_TOC_ATIP_DATA_BLOCK {
+
+ UCHAR CdrwReferenceSpeed : 3;
+ UCHAR Reserved3 : 1;
+ UCHAR WritePower : 3;
+ UCHAR True1 : 1;
+ UCHAR Reserved4 : 6;
+ UCHAR UnrestrictedUse : 1;
+ UCHAR Reserved5 : 1;
+ UCHAR A3Valid : 1;
+ UCHAR A2Valid : 1;
+ UCHAR A1Valid : 1;
+ UCHAR DiscSubType : 3;
+ UCHAR IsCdrw : 1;
+ UCHAR True2 : 1;
+ UCHAR Reserved7;
+
+ UCHAR LeadInMsf[3];
+ UCHAR Reserved8;
+
+ UCHAR LeadOutMsf[3];
+ UCHAR Reserved9;
+
+ UCHAR A1Values[3];
+ UCHAR Reserved10;
+
+ UCHAR A2Values[3];
+ UCHAR Reserved11;
+
+ UCHAR A3Values[3];
+ UCHAR Reserved12;
+
+} CDROM_TOC_ATIP_DATA_BLOCK, *PCDROM_TOC_ATIP_DATA_BLOCK;
+
+typedef struct _CDROM_TOC_ATIP_DATA {
+
+ //
+ // Header
+ //
+
+ UCHAR Length[2]; // add two bytes for this field
+ UCHAR Reserved1;
+ UCHAR Reserved2;
+
+ //
+ // zero? to N descriptors included.
+ //
+
+ CDROM_TOC_ATIP_DATA_BLOCK Descriptors[0];
+
+} CDROM_TOC_ATIP_DATA, *PCDROM_TOC_ATIP_DATA;
+
+//
+// CD ROM Table OF Contents
+// Format 5 - CD Text Info
+//
+typedef struct _CDROM_TOC_CD_TEXT_DATA_BLOCK {
+ UCHAR PackType;
+ UCHAR TrackNumber : 7;
+ UCHAR ExtensionFlag : 1; // should be zero!
+ UCHAR SequenceNumber;
+ UCHAR CharacterPosition : 4;
+ UCHAR BlockNumber : 3;
+ UCHAR Unicode : 1;
+ union {
+ UCHAR Text[12];
+ WCHAR WText[6];
+ };
+ UCHAR CRC[2];
+} CDROM_TOC_CD_TEXT_DATA_BLOCK, *PCDROM_TOC_CD_TEXT_DATA_BLOCK;
+
+typedef struct _CDROM_TOC_CD_TEXT_DATA {
+
+ //
+ // Header
+ //
+
+ UCHAR Length[2]; // add two bytes for this field
+ UCHAR Reserved1;
+ UCHAR Reserved2;
+
+ //
+ // the text info comes in discrete blocks of
+ // a heavily-overloaded structure
+ //
+
+ CDROM_TOC_CD_TEXT_DATA_BLOCK Descriptors[0];
+
+} CDROM_TOC_CD_TEXT_DATA, *PCDROM_TOC_CD_TEXT_DATA;
+
+//
+// These are the types used for PackType field in CDROM_TOC_CD_TEXT_DATA_BLOCK
+// and also for requesting specific info from IOCTL_CDROM_READ_CD_TEXT
+//
+#define CDROM_CD_TEXT_PACK_ALBUM_NAME 0x80
+#define CDROM_CD_TEXT_PACK_PERFORMER 0x81
+#define CDROM_CD_TEXT_PACK_SONGWRITER 0x82
+#define CDROM_CD_TEXT_PACK_COMPOSER 0x83
+#define CDROM_CD_TEXT_PACK_ARRANGER 0x84
+#define CDROM_CD_TEXT_PACK_MESSAGES 0x85
+#define CDROM_CD_TEXT_PACK_DISC_ID 0x86
+#define CDROM_CD_TEXT_PACK_GENRE 0x87
+#define CDROM_CD_TEXT_PACK_TOC_INFO 0x88
+#define CDROM_CD_TEXT_PACK_TOC_INFO2 0x89
+// 0x8a - 0x8d are reserved....
+#define CDROM_CD_TEXT_PACK_UPC_EAN 0x8e
+#define CDROM_CD_TEXT_PACK_SIZE_INFO 0x8f
+
+//
+// Play audio starting at MSF and ending at MSF
+//
+
+typedef struct _CDROM_PLAY_AUDIO_MSF {
+ UCHAR StartingM;
+ UCHAR StartingS;
+ UCHAR StartingF;
+ UCHAR EndingM;
+ UCHAR EndingS;
+ UCHAR EndingF;
+} CDROM_PLAY_AUDIO_MSF, *PCDROM_PLAY_AUDIO_MSF;
+
+//
+// Seek to MSF
+//
+
+typedef struct _CDROM_SEEK_AUDIO_MSF {
+ UCHAR M;
+ UCHAR S;
+ UCHAR F;
+} CDROM_SEEK_AUDIO_MSF, *PCDROM_SEEK_AUDIO_MSF;
+
+
+//
+// Flags for the disk type
+//
+
+typedef struct _CDROM_DISK_DATA {
+
+ ULONG DiskData;
+
+} CDROM_DISK_DATA, *PCDROM_DISK_DATA;
+
+#define CDROM_DISK_AUDIO_TRACK (0x00000001)
+#define CDROM_DISK_DATA_TRACK (0x00000002)
+
+//
+// CD ROM Data Mode Codes, used with IOCTL_CDROM_READ_Q_CHANNEL
+//
+
+#define IOCTL_CDROM_SUB_Q_CHANNEL 0x00
+#define IOCTL_CDROM_CURRENT_POSITION 0x01
+#define IOCTL_CDROM_MEDIA_CATALOG 0x02
+#define IOCTL_CDROM_TRACK_ISRC 0x03
+
+typedef struct _CDROM_SUB_Q_DATA_FORMAT {
+ UCHAR Format;
+ UCHAR Track;
+} CDROM_SUB_Q_DATA_FORMAT, *PCDROM_SUB_Q_DATA_FORMAT;
+
+
+//
+// CD ROM Sub-Q Channel Data Format
+//
+
+typedef struct _SUB_Q_HEADER {
+ UCHAR Reserved;
+ UCHAR AudioStatus;
+ UCHAR DataLength[2];
+} SUB_Q_HEADER, *PSUB_Q_HEADER;
+
+typedef struct _SUB_Q_CURRENT_POSITION {
+ SUB_Q_HEADER Header;
+ UCHAR FormatCode;
+ UCHAR Control : 4;
+ UCHAR ADR : 4;
+ UCHAR TrackNumber;
+ UCHAR IndexNumber;
+ UCHAR AbsoluteAddress[4];
+ UCHAR TrackRelativeAddress[4];
+} SUB_Q_CURRENT_POSITION, *PSUB_Q_CURRENT_POSITION;
+
+typedef struct _SUB_Q_MEDIA_CATALOG_NUMBER {
+ SUB_Q_HEADER Header;
+ UCHAR FormatCode;
+ UCHAR Reserved[3];
+ UCHAR Reserved1 : 7;
+ UCHAR Mcval : 1;
+ UCHAR MediaCatalog[15];
+} SUB_Q_MEDIA_CATALOG_NUMBER, *PSUB_Q_MEDIA_CATALOG_NUMBER;
+
+typedef struct _SUB_Q_TRACK_ISRC {
+ SUB_Q_HEADER Header;
+ UCHAR FormatCode;
+ UCHAR Reserved0;
+ UCHAR Track;
+ UCHAR Reserved1;
+ UCHAR Reserved2 : 7;
+ UCHAR Tcval : 1;
+ UCHAR TrackIsrc[15];
+} SUB_Q_TRACK_ISRC, *PSUB_Q_TRACK_ISRC;
+
+typedef union _SUB_Q_CHANNEL_DATA {
+ SUB_Q_CURRENT_POSITION CurrentPosition;
+ SUB_Q_MEDIA_CATALOG_NUMBER MediaCatalog;
+ SUB_Q_TRACK_ISRC TrackIsrc;
+} SUB_Q_CHANNEL_DATA, *PSUB_Q_CHANNEL_DATA;
+
+//
+// Audio Status Codes
+//
+
+#define AUDIO_STATUS_NOT_SUPPORTED 0x00
+#define AUDIO_STATUS_IN_PROGRESS 0x11
+#define AUDIO_STATUS_PAUSED 0x12
+#define AUDIO_STATUS_PLAY_COMPLETE 0x13
+#define AUDIO_STATUS_PLAY_ERROR 0x14
+#define AUDIO_STATUS_NO_STATUS 0x15
+
+//
+// ADR Sub-channel Q Field
+//
+
+#define ADR_NO_MODE_INFORMATION 0x0
+#define ADR_ENCODES_CURRENT_POSITION 0x1
+#define ADR_ENCODES_MEDIA_CATALOG 0x2
+#define ADR_ENCODES_ISRC 0x3
+
+//
+// Sub-channel Q Control Bits
+//
+
+#define AUDIO_WITH_PREEMPHASIS 0x1
+#define DIGITAL_COPY_PERMITTED 0x2
+#define AUDIO_DATA_TRACK 0x4
+#define TWO_FOUR_CHANNEL_AUDIO 0x8
+
+//
+// Get Audio control parameters
+//
+
+typedef struct _CDROM_AUDIO_CONTROL {
+ UCHAR LbaFormat;
+ USHORT LogicalBlocksPerSecond;
+} CDROM_AUDIO_CONTROL, *PCDROM_AUDIO_CONTROL;
+
+//
+// Volume control - Volume takes a value between 1 and 0xFF.
+// SCSI-II CDROM audio suppports up to 4 audio ports with
+// Independent volume control.
+//
+
+typedef struct _VOLUME_CONTROL {
+ UCHAR PortVolume[4];
+} VOLUME_CONTROL, *PVOLUME_CONTROL;
+
+typedef enum _TRACK_MODE_TYPE {
+ YellowMode2,
+ XAForm2,
+ CDDA
+} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
+
+//
+// Passed to cdrom to describe the raw read, ie. Mode 2, Form 2, CDDA...
+//
+
+typedef struct __RAW_READ_INFO {
+ LARGE_INTEGER DiskOffset;
+ ULONG SectorCount;
+ TRACK_MODE_TYPE TrackMode;
+} RAW_READ_INFO, *PRAW_READ_INFO;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#if _MSC_VER >= 1200
+#pragma warning(pop) // un-sets any local warning changes
+#else
+#pragma warning(default:4200) // array[0] is not a warning for this file
+#pragma warning(default:4201) // nameless struct/unions
+#pragma warning(default:4214) // bit fields other than int
+#endif
+
+
+#endif // _NTDDCDRM_
+
+// end_winioctl
+
+
diff --git a/include/winddk/ntddcdvd.h b/include/winddk/ntddcdvd.h
new file mode 100644
index 000000000..e6d22d1ad
--- /dev/null
+++ b/include/winddk/ntddcdvd.h
@@ -0,0 +1,294 @@
+/*++ BUILD Version: 0001 // Increment this if a change has global effects
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ ntddcdvd.h
+
+Abstract:
+
+ This module contains structures and definitions
+ associated with DVD ioctls.
+
+ This module is used in conjunction with ntddcdrm.h which contains the
+ cdrom specific ioctls which will work on CDVD drives
+
+Author:
+
+ Peter Wieland
+
+Revision History:
+
+--*/
+
+// begin_winioctl
+
+#ifndef _NTDDCDVD_
+#define _NTDDCDVD_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include <pshpack1.h>
+
+
+//
+// NtDeviceIoControlFile IoControlCode values for this device.
+//
+// Warning: Remember that the low two bits of the code specify how the
+// buffers are passed to the driver!
+//
+
+#define IOCTL_DVD_BASE FILE_DEVICE_DVD
+
+//
+// CDVD Device Control Functions
+//
+// Warning: Ioctls from 200 through 300 are used for the old common class
+// driver ioctls and should not be used for device specific functionality
+//
+
+//
+// Copyright ioctls
+//
+
+#define IOCTL_DVD_START_SESSION CTL_CODE(IOCTL_DVD_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DVD_READ_KEY CTL_CODE(IOCTL_DVD_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DVD_SEND_KEY CTL_CODE(IOCTL_DVD_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DVD_END_SESSION CTL_CODE(IOCTL_DVD_BASE, 0x0403, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DVD_SET_READ_AHEAD CTL_CODE(IOCTL_DVD_BASE, 0x0404, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DVD_GET_REGION CTL_CODE(IOCTL_DVD_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DVD_SEND_KEY2 CTL_CODE(IOCTL_DVD_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+//
+// DVD Structure queries
+//
+
+#define IOCTL_DVD_READ_STRUCTURE CTL_CODE(IOCTL_DVD_BASE, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+//
+// The following file contains the IOCTL_STORAGE class ioctl definitions
+//
+
+#define IOCTL_STORAGE_SET_READ_AHEAD CTL_CODE(IOCTL_STORAGE_BASE, 0x0100, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+// end_winioctl
+
+//#include <ntddstor.h>
+#include "ntddstor.h"
+
+// begin_winioctl
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ DvdChallengeKey = 0x01,
+ DvdBusKey1,
+ DvdBusKey2,
+ DvdTitleKey,
+ DvdAsf,
+ DvdSetRpcKey = 0x6,
+ DvdGetRpcKey = 0x8,
+ DvdDiskKey = 0x80,
+ DvdInvalidateAGID = 0x3f
+} DVD_KEY_TYPE;
+
+typedef ULONG DVD_SESSION_ID, *PDVD_SESSION_ID;
+
+typedef struct _DVD_COPY_PROTECT_KEY {
+ ULONG KeyLength;
+ DVD_SESSION_ID SessionId;
+ DVD_KEY_TYPE KeyType;
+ ULONG KeyFlags;
+ union {
+ HANDLE FileHandle;
+ LARGE_INTEGER TitleOffset;
+ } Parameters;
+ UCHAR KeyData[0];
+} DVD_COPY_PROTECT_KEY, *PDVD_COPY_PROTECT_KEY;
+
+//
+// Predefined (Mt. Fuji) key sizes
+// Add sizeof(DVD_COPY_PROTECT_KEY) to get allocation size for
+// the full key structure
+//
+
+#define DVD_CHALLENGE_KEY_LENGTH (12 + sizeof(DVD_COPY_PROTECT_KEY))
+#define DVD_BUS_KEY_LENGTH (8 + sizeof(DVD_COPY_PROTECT_KEY))
+#define DVD_TITLE_KEY_LENGTH (8 + sizeof(DVD_COPY_PROTECT_KEY))
+#define DVD_DISK_KEY_LENGTH (2048 + sizeof(DVD_COPY_PROTECT_KEY))
+#define DVD_RPC_KEY_LENGTH (sizeof(DVD_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY))
+#define DVD_SET_RPC_KEY_LENGTH (sizeof(DVD_SET_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY))
+#define DVD_ASF_LENGTH (sizeof(DVD_ASF) + sizeof(DVD_COPY_PROTECT_KEY))
+
+//
+// Used with IOCTL_DVD_END_SESSION to end all DVD sessions at once
+//
+
+#define DVD_END_ALL_SESSIONS ((DVD_SESSION_ID) 0xffffffff)
+
+//
+// CGMS Copy Protection Flags
+//
+
+#define DVD_CGMS_RESERVED_MASK 0x00000078
+
+#define DVD_CGMS_COPY_PROTECT_MASK 0x00000018
+#define DVD_CGMS_COPY_PERMITTED 0x00000000
+#define DVD_CGMS_COPY_ONCE 0x00000010
+#define DVD_CGMS_NO_COPY 0x00000018
+
+#define DVD_COPYRIGHT_MASK 0x00000040
+#define DVD_NOT_COPYRIGHTED 0x00000000
+#define DVD_COPYRIGHTED 0x00000040
+
+#define DVD_SECTOR_PROTECT_MASK 0x00000020
+#define DVD_SECTOR_NOT_PROTECTED 0x00000000
+#define DVD_SECTOR_PROTECTED 0x00000020
+
+/*++
+
+IOCTL_STORAGE_SET_READ_AHEAD
+
+Requests that the storage device skip to TargetAddress once it has run across
+TriggerAddress during the course of it's read-ahead caching operations.
+
+Input:
+
+ a STORAGE_SET_READ_AHEAD structure which contains:
+ * the trigger address
+ * the target address
+
+Output:
+
+ none
+
+--*/
+
+typedef struct _STORAGE_SET_READ_AHEAD {
+ LARGE_INTEGER TriggerAddress;
+ LARGE_INTEGER TargetAddress;
+} STORAGE_SET_READ_AHEAD, *PSTORAGE_SET_READ_AHEAD;
+
+/*++
+
+IOCTL_DVD_READ_STRUCTURE
+
+Issues a READ_DVD_STRUCTURE command to the drive.
+
+Input:
+
+ a DVD_READ_STRUCTURE describing what information is requested
+
+Output:
+
+ a DVD Layer Descriptor as defined below
+
+--*/
+
+typedef enum DVD_STRUCTURE_FORMAT {
+ DvdPhysicalDescriptor,
+ DvdCopyrightDescriptor,
+ DvdDiskKeyDescriptor,
+ DvdBCADescriptor,
+ DvdManufacturerDescriptor,
+ DvdMaxDescriptor
+} DVD_STRUCTURE_FORMAT, *PDVD_STRUCTURE_FORMAT;
+
+typedef struct DVD_READ_STRUCTURE {
+ LARGE_INTEGER BlockByteOffset;
+ DVD_STRUCTURE_FORMAT Format;
+ DVD_SESSION_ID SessionId;
+ UCHAR LayerNumber;
+} DVD_READ_STRUCTURE, *PDVD_READ_STRUCTURE;
+
+typedef struct _DVD_DESCRIPTOR_HEADER {
+ USHORT Length;
+ UCHAR Reserved[2];
+ UCHAR Data[0];
+} DVD_DESCRIPTOR_HEADER, *PDVD_DESCRIPTOR_HEADER;
+
+typedef struct _DVD_LAYER_DESCRIPTOR {
+ UCHAR BookVersion : 4;
+ UCHAR BookType : 4;
+ UCHAR MinimumRate : 4;
+ UCHAR DiskSize : 4;
+ UCHAR LayerType : 4;
+ UCHAR TrackPath : 1;
+ UCHAR NumberOfLayers : 2;
+ UCHAR Reserved1 : 1;
+ UCHAR TrackDensity : 4;
+ UCHAR LinearDensity : 4;
+ ULONG StartingDataSector;
+ ULONG EndDataSector;
+ ULONG EndLayerZeroSector;
+ UCHAR Reserved5 : 7;
+ UCHAR BCAFlag : 1;
+ UCHAR Reserved6;
+} DVD_LAYER_DESCRIPTOR, *PDVD_LAYER_DESCRIPTOR;
+
+typedef struct _DVD_COPYRIGHT_DESCRIPTOR {
+ UCHAR CopyrightProtectionType;
+ UCHAR RegionManagementInformation;
+ USHORT Reserved;
+} DVD_COPYRIGHT_DESCRIPTOR, *PDVD_COPYRIGHT_DESCRIPTOR;
+
+typedef struct _DVD_DISK_KEY_DESCRIPTOR {
+ UCHAR DiskKeyData[2048];
+} DVD_DISK_KEY_DESCRIPTOR, *PDVD_DISK_KEY_DESCRIPTOR;
+
+typedef struct _DVD_BCA_DESCRIPTOR {
+ UCHAR BCAInformation[0];
+} DVD_BCA_DESCRIPTOR, *PDVD_BCA_DESCRIPTOR;
+
+typedef struct _DVD_MANUFACTURER_DESCRIPTOR {
+ UCHAR ManufacturingInformation[2048];
+} DVD_MANUFACTURER_DESCRIPTOR, *PDVD_MANUFACTURER_DESCRIPTOR;
+
+typedef struct _DVD_RPC_KEY {
+ UCHAR UserResetsAvailable:3;
+ UCHAR ManufacturerResetsAvailable:3;
+ UCHAR TypeCode:2;
+ UCHAR RegionMask;
+ UCHAR RpcScheme;
+ UCHAR Reserved2[1];
+} DVD_RPC_KEY, * PDVD_RPC_KEY;
+
+typedef struct _DVD_SET_RPC_KEY {
+ UCHAR PreferredDriveRegionCode;
+ UCHAR Reserved[3];
+} DVD_SET_RPC_KEY, * PDVD_SET_RPC_KEY;
+
+typedef struct _DVD_ASF {
+ UCHAR Reserved0[3];
+ UCHAR SuccessFlag:1;
+ UCHAR Reserved1:7;
+} DVD_ASF, * PDVD_ASF;
+
+#if 0
+typedef struct _DVD_REGION {
+ UCHAR CopySystem;
+ UCHAR RegionData; // current media region (not playable when set)
+ UCHAR SystemRegion; // current drive region (playable when set)
+ UCHAR ResetCount; // number of resets available
+} DVD_REGION, *PDVD_REGION;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#include <poppack.h>
+
+
+#endif // _NTDDCDVD_
+
+// end_winioctl
+
+
diff --git a/include/winddk/ntdddisk.h b/include/winddk/ntdddisk.h
new file mode 100644
index 000000000..6a6a892f7
--- /dev/null
+++ b/include/winddk/ntdddisk.h
@@ -0,0 +1,1217 @@
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ ntdddisk.h
+
+Abstract:
+
+ This is the include file that defines all constants and types for
+ accessing the Disk device.
+
+Revision History:
+
+--*/
+
+
+#ifndef _NTDDDISK_H_
+#define _NTDDDISK_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include <diskguid.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//
+// Device Name - this string is the name of the device. It is the name
+// that should be passed to NtOpenFile when accessing the device.
+//
+// Note: For devices that support multiple units, it should be suffixed
+// with the Ascii representation of the unit number.
+//
+
+#define DD_DISK_DEVICE_NAME "\\Device\\UNKNOWN"
+
+
+//
+// NtDeviceIoControlFile
+
+// begin_winioctl
+
+//
+// IoControlCode values for disk devices.
+//
+
+#define IOCTL_DISK_BASE FILE_DEVICE_DISK
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_PERFORMANCE_OFF CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+
+
+#if(_WIN32_WINNT >= 0x0400)
+#define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+//
+// IOCTL support for SMART drive fault prediction.
+//
+
+#define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#endif /* _WIN32_WINNT >= 0x0400 */
+
+#if (_WIN32_WINNT >= 0x500)
+
+//
+// New IOCTLs for GUID Partition tabled disks.
+//
+
+#define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_SET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_CREATE_DISK CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#endif /* _WIN32_WINNT >= 0x0500 */
+
+
+#if(_WIN32_WINNT >= 0x0500)
+#define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_WRITE_CACHE_STATE CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+//
+// Called to flush cached information that the driver may have about this
+// device's characteristics. Not all drivers cache characteristics, and not
+// cached properties can be flushed. This simply serves as an update to the
+// driver that it may want to do an expensive reexamination of the device's
+// characteristics now (fixed media size, partition table, etc...)
+//
+
+#define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE, 0x0050, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+//
+// Special IOCTLs needed to support PC-98 machines in Japan
+//
+
+#define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#endif /* _WIN32_WINNT >= 0x0500 */
+
+// end_winioctl
+
+//
+// Internal disk driver device controls to maintain the verify status bit
+// for the device object.
+//
+
+#define IOCTL_DISK_INTERNAL_SET_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define IOCTL_DISK_INTERNAL_CLEAR_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+//
+// Internal disk driver device control to set notification routine for
+// the device object. Used in DiskPerf.
+//
+
+#define IOCTL_DISK_INTERNAL_SET_NOTIFY CTL_CODE(IOCTL_DISK_BASE, 0x0102, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+// begin_winioctl
+//
+// The following device control codes are common for all class drivers. The
+// functions codes defined here must match all of the other class drivers.
+//
+// Warning: these codes will be replaced in the future by equivalent
+// IOCTL_STORAGE codes
+//
+
+#define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+// end_winioctl
+
+//
+// The following file contains the IOCTL_STORAGE class ioctls
+//
+
+#include <ntddstor.h>
+
+// begin_winioctl
+//
+// Define the partition types returnable by known disk drivers.
+//
+
+#define PARTITION_ENTRY_UNUSED 0x00 // Entry unused
+#define PARTITION_FAT_12 0x01 // 12-bit FAT entries
+#define PARTITION_XENIX_1 0x02 // Xenix
+#define PARTITION_XENIX_2 0x03 // Xenix
+#define PARTITION_FAT_16 0x04 // 16-bit FAT entries
+#define PARTITION_EXTENDED 0x05 // Extended partition entry
+#define PARTITION_HUGE 0x06 // Huge partition MS-DOS V4
+#define PARTITION_IFS 0x07 // IFS Partition
+#define PARTITION_OS2BOOTMGR 0x0A // OS/2 Boot Manager/OPUS/Coherent swap
+#define PARTITION_FAT32 0x0B // FAT32
+#define PARTITION_FAT32_XINT13 0x0C // FAT32 using extended int13 services
+#define PARTITION_XINT13 0x0E // Win95 partition using extended int13 services
+#define PARTITION_XINT13_EXTENDED 0x0F // Same as type 5 but uses extended int13 services
+#define PARTITION_PREP 0x41 // PowerPC Reference Platform (PReP) Boot Partition
+#define PARTITION_LDM 0x42 // Logical Disk Manager partition
+#define PARTITION_UNIX 0x63 // Unix
+
+#define VALID_NTFT 0xC0 // NTFT uses high order bits
+
+//
+// The high bit of the partition type code indicates that a partition
+// is part of an NTFT mirror or striped array.
+//
+
+#define PARTITION_NTFT 0x80 // NTFT partition
+
+//
+// The following macro is used to determine which partitions should be
+// assigned drive letters.
+//
+
+//++
+//
+// BOOLEAN
+// IsRecognizedPartition(
+// IN ULONG PartitionType
+// )
+//
+// Routine Description:
+//
+// This macro is used to determine to which partitions drive letters
+// should be assigned.
+//
+// Arguments:
+//
+// PartitionType - Supplies the type of the partition being examined.
+//
+// Return Value:
+//
+// The return value is TRUE if the partition type is recognized,
+// otherwise FALSE is returned.
+//
+//--
+
+#define IsRecognizedPartition( PartitionType ) ( \
+ ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT_12)) || \
+ ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_IFS)) || \
+ ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_HUGE)) || \
+ ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT32)) || \
+ ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_FAT32_XINT13)) || \
+ ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0) == PARTITION_XINT13)) || \
+ ((PartitionType) == PARTITION_FAT_12) || \
+ ((PartitionType) == PARTITION_FAT_16) || \
+ ((PartitionType) == PARTITION_IFS) || \
+ ((PartitionType) == PARTITION_HUGE) || \
+ ((PartitionType) == PARTITION_FAT32) || \
+ ((PartitionType) == PARTITION_FAT32_XINT13) || \
+ ((PartitionType) == PARTITION_XINT13) )
+
+//++
+//
+// BOOLEAN
+// IsContainerPartition(
+// IN ULONG PartitionType
+// )
+//
+// Routine Description:
+//
+// This macro is used to determine to which partition types are actually
+// containers for other partitions (ie, extended partitions).
+//
+// Arguments:
+//
+// PartitionType - Supplies the type of the partition being examined.
+//
+// Return Value:
+//
+// The return value is TRUE if the partition type is a container,
+// otherwise FALSE is returned.
+//
+//--
+
+#define IsContainerPartition( PartitionType ) \
+ ((PartitionType == PARTITION_EXTENDED) || (PartitionType == PARTITION_XINT13_EXTENDED))
+
+//++
+//
+// BOOLEAN
+// IsFTPartition(
+// IN ULONG PartitionType
+// )
+//
+// Routine Description:
+//
+// This macro is used to determine if the given partition is an FT
+// partition.
+//
+// Arguments:
+//
+// PartitionType - Supplies the type of the partition being examined.
+//
+// Return Value:
+//
+// The return value is TRUE if the partition type is an FT partition,
+// otherwise FALSE is returned.
+//
+//--
+
+#define IsFTPartition( PartitionType ) \
+ (((PartitionType)&PARTITION_NTFT) && IsRecognizedPartition(PartitionType))
+
+//
+// Define the media types supported by the driver.
+//
+
+typedef enum _MEDIA_TYPE {
+ Unknown, // Format is unknown
+ F5_1Pt2_512, // 5.25", 1.2MB, 512 bytes/sector
+ F3_1Pt44_512, // 3.5", 1.44MB, 512 bytes/sector
+ F3_2Pt88_512, // 3.5", 2.88MB, 512 bytes/sector
+ F3_20Pt8_512, // 3.5", 20.8MB, 512 bytes/sector
+ F3_720_512, // 3.5", 720KB, 512 bytes/sector
+ F5_360_512, // 5.25", 360KB, 512 bytes/sector
+ F5_320_512, // 5.25", 320KB, 512 bytes/sector
+ F5_320_1024, // 5.25", 320KB, 1024 bytes/sector
+ F5_180_512, // 5.25", 180KB, 512 bytes/sector
+ F5_160_512, // 5.25", 160KB, 512 bytes/sector
+ RemovableMedia, // Removable media other than floppy
+ FixedMedia, // Fixed hard disk media
+ F3_120M_512, // 3.5", 120M Floppy
+ F3_640_512, // 3.5" , 640KB, 512 bytes/sector
+ F5_640_512, // 5.25", 640KB, 512 bytes/sector
+ F5_720_512, // 5.25", 720KB, 512 bytes/sector
+ F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector
+ F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector
+ F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector
+ F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector
+ F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector
+ F8_256_128, // 8", 256KB, 128 bytes/sector
+ F3_200Mb_512, // 3.5", 200M Floppy (HiFD)
+ F3_240M_512, // 3.5", 240Mb Floppy (HiFD)
+ F3_32M_512 // 3.5", 32Mb Floppy
+} MEDIA_TYPE, *PMEDIA_TYPE;
+
+//
+// Define the input buffer structure for the driver, when
+// it is called with IOCTL_DISK_FORMAT_TRACKS.
+//
+
+typedef struct _FORMAT_PARAMETERS {
+ MEDIA_TYPE MediaType;
+ ULONG StartCylinderNumber;
+ ULONG EndCylinderNumber;
+ ULONG StartHeadNumber;
+ ULONG EndHeadNumber;
+} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
+
+//
+// Define the BAD_TRACK_NUMBER type. An array of elements of this type is
+// returned by the driver on IOCTL_DISK_FORMAT_TRACKS requests, to indicate
+// what tracks were bad during formatting. The length of that array is
+// reported in the `Information' field of the I/O Status Block.
+//
+
+typedef USHORT BAD_TRACK_NUMBER;
+typedef USHORT *PBAD_TRACK_NUMBER;
+
+//
+// Define the input buffer structure for the driver, when
+// it is called with IOCTL_DISK_FORMAT_TRACKS_EX.
+//
+
+typedef struct _FORMAT_EX_PARAMETERS {
+ MEDIA_TYPE MediaType;
+ ULONG StartCylinderNumber;
+ ULONG EndCylinderNumber;
+ ULONG StartHeadNumber;
+ ULONG EndHeadNumber;
+ USHORT FormatGapLength;
+ USHORT SectorsPerTrack;
+ USHORT SectorNumber[1];
+} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
+
+//
+// The following structure is returned on an IOCTL_DISK_GET_DRIVE_GEOMETRY
+// request and an array of them is returned on an IOCTL_DISK_GET_MEDIA_TYPES
+// request.
+//
+
+typedef struct _DISK_GEOMETRY {
+ LARGE_INTEGER Cylinders;
+ MEDIA_TYPE MediaType;
+ ULONG TracksPerCylinder;
+ ULONG SectorsPerTrack;
+ ULONG BytesPerSector;
+} DISK_GEOMETRY, *PDISK_GEOMETRY;
+
+
+
+//
+// This wmi guid returns a DISK_GEOMETRY structure
+//
+#define WMI_DISK_GEOMETRY_GUID { 0x25007f51, 0x57c2, 0x11d1, { 0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10 } }
+
+
+
+//
+// The following structure is returned on an IOCTL_DISK_GET_PARTITION_INFO
+// and an IOCTL_DISK_GET_DRIVE_LAYOUT request. It is also used in a request
+// to change the drive layout, IOCTL_DISK_SET_DRIVE_LAYOUT.
+//
+
+typedef struct _PARTITION_INFORMATION {
+ LARGE_INTEGER StartingOffset;
+ LARGE_INTEGER PartitionLength;
+ ULONG HiddenSectors;
+ ULONG PartitionNumber;
+ UCHAR PartitionType;
+ BOOLEAN BootIndicator;
+ BOOLEAN RecognizedPartition;
+ BOOLEAN RewritePartition;
+} PARTITION_INFORMATION, *PPARTITION_INFORMATION;
+
+//
+// The following structure is used to change the partition type of a
+// specified disk partition using an IOCTL_DISK_SET_PARTITION_INFO
+// request.
+//
+
+typedef struct _SET_PARTITION_INFORMATION {
+ UCHAR PartitionType;
+} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
+
+//
+// The following structures is returned on an IOCTL_DISK_GET_DRIVE_LAYOUT
+// request and given as input to an IOCTL_DISK_SET_DRIVE_LAYOUT request.
+//
+
+typedef struct _DRIVE_LAYOUT_INFORMATION {
+ ULONG PartitionCount;
+ ULONG Signature;
+ PARTITION_INFORMATION PartitionEntry[1];
+} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION;
+
+//
+// The following structure is passed in on an IOCTL_DISK_VERIFY request.
+// The offset and length parameters are both given in bytes.
+//
+
+typedef struct _VERIFY_INFORMATION {
+ LARGE_INTEGER StartingOffset;
+ ULONG Length;
+} VERIFY_INFORMATION, *PVERIFY_INFORMATION;
+
+//
+// The following structure is passed in on an IOCTL_DISK_REASSIGN_BLOCKS
+// request.
+//
+
+typedef struct _REASSIGN_BLOCKS {
+ USHORT Reserved;
+ USHORT Count;
+ ULONG BlockNumber[1];
+} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
+
+
+#if(_WIN32_WINNT >= 0x500)
+
+//
+// Support for GUID Partition Table (GPT) disks.
+//
+
+//
+// There are currently two ways a disk can be partitioned. With a traditional
+// AT-style master boot record (PARTITION_STYLE_MBR) and with a new, GPT
+// partition table (PARTITION_STYLE_GPT). RAW is for an unrecognizable
+// partition style. There are a very limited number of things you can
+// do with a RAW partititon.
+//
+
+typedef enum _PARTITION_STYLE {
+ PARTITION_STYLE_MBR,
+ PARTITION_STYLE_GPT,
+ PARTITION_STYLE_RAW
+} PARTITION_STYLE;
+
+
+//
+// The following structure defines information in a GPT partition that is
+// not common to both GPT and MBR partitions.
+//
+
+typedef struct _PARTITION_INFORMATION_GPT {
+ GUID PartitionType; // Partition type. See table 16-3.
+ GUID PartitionId; // Unique GUID for this partition.
+ ULONG64 Attributes; // See table 16-4.
+ WCHAR Name [36]; // Partition Name in Unicode.
+} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
+
+//
+// The following are GPT partition attributes applicable for any
+// partition type. These attributes are not OS-specific
+//
+
+#define GPT_ATTRIBUTE_PLATFORM_REQUIRED (0x0000000000000001)
+
+//
+// The following are GPT partition attributes applicable when the
+// PartitionType is PARTITION_BASIC_DATA_GUID.
+//
+
+#define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER (0x8000000000000000)
+#define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN (0x4000000000000000)
+#define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY (0x1000000000000000)
+
+//
+// The following structure defines information in an MBR partition that is not
+// common to both GPT and MBR partitions.
+//
+
+typedef struct _PARTITION_INFORMATION_MBR {
+ UCHAR PartitionType;
+ BOOLEAN BootIndicator;
+ BOOLEAN RecognizedPartition;
+ ULONG HiddenSectors;
+} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
+
+
+//
+// The structure SET_PARTITION_INFO_EX is used with the ioctl
+// IOCTL_SET_PARTITION_INFO_EX to set information about a specific
+// partition. Note that for MBR partitions, you can only set the partition
+// signature, whereas GPT partitions allow setting of all fields that
+// you can get.
+//
+
+typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
+typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
+
+
+typedef struct _SET_PARTITION_INFORMATION_EX {
+ PARTITION_STYLE PartitionStyle;
+ union {
+ SET_PARTITION_INFORMATION_MBR Mbr;
+ SET_PARTITION_INFORMATION_GPT Gpt;
+ };
+} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
+
+
+//
+// The structure CREATE_DISK_GPT with the ioctl IOCTL_DISK_CREATE_DISK
+// to initialize an virgin disk with an empty GPT partition table.
+//
+
+typedef struct _CREATE_DISK_GPT {
+ GUID DiskId; // Unique disk id for the disk.
+ ULONG MaxPartitionCount; // Maximim number of partitions allowable.
+} CREATE_DISK_GPT, *PCREATE_DISK_GPT;
+
+//
+// The structure CREATE_DISK_MBR with the ioctl IOCTL_DISK_CREATE_DISK
+// to initialize an virgin disk with an empty MBR partition table.
+//
+
+typedef struct _CREATE_DISK_MBR {
+ ULONG Signature;
+} CREATE_DISK_MBR, *PCREATE_DISK_MBR;
+
+
+typedef struct _CREATE_DISK {
+ PARTITION_STYLE PartitionStyle;
+ union {
+ CREATE_DISK_MBR Mbr;
+ CREATE_DISK_GPT Gpt;
+ };
+} CREATE_DISK, *PCREATE_DISK;
+
+
+//
+// The structure GET_LENGTH_INFORMATION is used with the ioctl
+// IOCTL_DISK_GET_LENGTH_INFO to obtain the length, in bytes, of the
+// disk, partition, or volume.
+//
+
+typedef struct _GET_LENGTH_INFORMATION {
+ LARGE_INTEGER Length;
+} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
+
+//
+// The PARTITION_INFORMATION_EX structure is used with the
+// IOCTL_DISK_GET_DRIVE_LAYOUT_EX, IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
+// IOCTL_DISK_GET_PARTITION_INFO_EX and IOCTL_DISK_GET_PARTITION_INFO_EX calls.
+//
+
+typedef struct _PARTITION_INFORMATION_EX {
+ PARTITION_STYLE PartitionStyle;
+ LARGE_INTEGER StartingOffset;
+ LARGE_INTEGER PartitionLength;
+ ULONG PartitionNumber;
+ BOOLEAN RewritePartition;
+ union {
+ PARTITION_INFORMATION_MBR Mbr;
+ PARTITION_INFORMATION_GPT Gpt;
+ };
+} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
+
+
+//
+// GPT specific drive layout information.
+//
+
+typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
+ GUID DiskId;
+ LARGE_INTEGER StartingUsableOffset;
+ LARGE_INTEGER UsableLength;
+ ULONG MaxPartitionCount;
+} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
+
+
+//
+// MBR specific drive layout information.
+//
+
+typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
+ ULONG Signature;
+} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
+
+//
+// The structure DRIVE_LAYOUT_INFORMATION_EX is used with the
+// IOCTL_SET_DRIVE_LAYOUT_EX and IOCTL_GET_DRIVE_LAYOUT_EX calls.
+//
+
+typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
+ ULONG PartitionStyle;
+ ULONG PartitionCount;
+ union {
+ DRIVE_LAYOUT_INFORMATION_MBR Mbr;
+ DRIVE_LAYOUT_INFORMATION_GPT Gpt;
+ };
+ PARTITION_INFORMATION_EX PartitionEntry[1];
+} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
+
+
+#endif // (_WIN32_WINNT >= 0x0500)
+
+
+#if(_WIN32_WINNT >= 0x0500)
+
+//
+// The DISK_GEOMETRY_EX structure is returned on issuing an
+// IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ioctl.
+//
+
+typedef enum _DETECTION_TYPE {
+ DetectNone,
+ DetectInt13,
+ DetectExInt13
+} DETECTION_TYPE;
+
+typedef struct _DISK_INT13_INFO {
+ USHORT DriveSelect;
+ ULONG MaxCylinders;
+ USHORT SectorsPerTrack;
+ USHORT MaxHeads;
+ USHORT NumberDrives;
+} DISK_INT13_INFO, *PDISK_INT13_INFO;
+
+typedef struct _DISK_EX_INT13_INFO {
+ USHORT ExBufferSize;
+ USHORT ExFlags;
+ ULONG ExCylinders;
+ ULONG ExHeads;
+ ULONG ExSectorsPerTrack;
+ ULONG64 ExSectorsPerDrive;
+ USHORT ExSectorSize;
+ USHORT ExReserved;
+} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
+
+typedef struct _DISK_DETECTION_INFO {
+ ULONG SizeOfDetectInfo;
+ DETECTION_TYPE DetectionType;
+ union {
+ struct {
+
+ //
+ // If DetectionType == DETECTION_INT13 then we have just the Int13
+ // information.
+ //
+
+ DISK_INT13_INFO Int13;
+
+ //
+ // If DetectionType == DETECTION_EX_INT13, then we have the
+ // extended int 13 information.
+ //
+
+ DISK_EX_INT13_INFO ExInt13; // If DetectionType == DetectExInt13
+ };
+ };
+} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
+
+
+typedef struct _DISK_PARTITION_INFO {
+ ULONG SizeOfPartitionInfo;
+ PARTITION_STYLE PartitionStyle; // PartitionStyle = RAW, GPT or MBR
+ union {
+ struct { // If PartitionStyle == MBR
+ ULONG Signature; // MBR Signature
+ ULONG CheckSum; // MBR CheckSum
+ } Mbr;
+ struct { // If PartitionStyle == GPT
+ GUID DiskId;
+ } Gpt;
+ };
+} DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
+
+
+//
+// The Geometry structure is a variable length structure composed of a
+// DISK_GEOMETRY_EX structure followed by a DISK_PARTITION_INFO structure
+// followed by a DISK_DETECTION_DATA structure.
+//
+
+#define DiskGeometryGetPartition(Geometry)\
+ ((PDISK_PARTITION_INFO)((Geometry)+1))
+
+#define DiskGeometryGetDetect(Geometry)\
+ ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry)+\
+ DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
+
+typedef struct _DISK_GEOMETRY_EX {
+ DISK_GEOMETRY Geometry; // Standard disk geometry: may be faked by driver.
+ LARGE_INTEGER DiskSize; // Must always be correct
+ UCHAR Data[1]; // Partition, Detect info
+} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
+
+#endif // (_WIN32_WINNT > 0x0500)
+
+#if(_WIN32_WINNT >= 0x0400)
+//
+// IOCTL_DISK_CONTROLLER_NUMBER returns the controller and disk
+// number for the handle. This is used to determine if a disk
+// is attached to the primary or secondary IDE controller.
+//
+
+typedef struct _DISK_CONTROLLER_NUMBER {
+ ULONG ControllerNumber;
+ ULONG DiskNumber;
+} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
+#endif /* _WIN32_WINNT >= 0x0400 */
+
+#if(_WIN32_WINNT >= 0x0500)
+
+
+//
+// IOCTL_DISK_SET_CACHE allows the caller to get or set the state of the disk
+// read/write caches.
+//
+// If the structure is provided as the input buffer for the ioctl the read &
+// write caches will be enabled or disabled depending on the parameters
+// provided.
+//
+// If the structure is provided as an output buffer for the ioctl the state
+// of the read & write caches will be returned. If both input and outut buffers
+// are provided the output buffer will contain the cache state BEFORE any
+// changes are made
+//
+
+typedef enum {
+ EqualPriority,
+ KeepPrefetchedData,
+ KeepReadData
+} DISK_CACHE_RETENTION_PRIORITY;
+
+typedef enum _DISK_WRITE_CACHE_STATE {
+ DiskWriteCacheNormal,
+ DiskWriteCacheForceDisable,
+ DiskWriteCacheDisableNotSupported
+} DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE;
+
+
+typedef struct _DISK_CACHE_INFORMATION {
+
+ //
+ // on return indicates that the device is capable of saving any parameters
+ // in non-volatile storage. On send indicates that the device should
+ // save the state in non-volatile storage.
+ //
+
+ BOOLEAN ParametersSavable;
+
+ //
+ // Indicates whether the write and read caches are enabled.
+ //
+
+ BOOLEAN ReadCacheEnabled;
+ BOOLEAN WriteCacheEnabled;
+
+ //
+ // Controls the likelyhood of data remaining in the cache depending on how
+ // it got there. Data cached from a READ or WRITE operation may be given
+ // higher, lower or equal priority to data entered into the cache for other
+ // means (like prefetch)
+ //
+
+ DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
+ DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
+
+ //
+ // Requests for a larger number of blocks than this may have prefetching
+ // disabled. If this value is set to 0 prefetch will be disabled.
+ //
+
+ USHORT DisablePrefetchTransferLength;
+
+ //
+ // If TRUE then ScalarPrefetch (below) will be valid. If FALSE then
+ // the minimum and maximum values should be treated as a block count
+ // (BlockPrefetch)
+ //
+
+ BOOLEAN PrefetchScalar;
+
+ //
+ // Contains the minimum and maximum amount of data which will be
+ // will be prefetched into the cache on a disk operation. This value
+ // may either be a scalar multiplier of the transfer length of the request,
+ // or an abolute number of disk blocks. PrefetchScalar (above) indicates
+ // which interpretation is used.
+ //
+
+ union {
+ struct {
+ USHORT Minimum;
+ USHORT Maximum;
+
+ //
+ // The maximum number of blocks which will be prefetched - useful
+ // with the scalar limits to set definite upper limits.
+ //
+
+ USHORT MaximumBlocks;
+ } ScalarPrefetch;
+
+ struct {
+ USHORT Minimum;
+ USHORT Maximum;
+ } BlockPrefetch;
+ };
+
+} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
+
+//
+// IOCTL_DISK_GROW_PARTITION will update the size of a partition
+// by adding sectors to the length. The number of sectors must be
+// predetermined by examining PARTITION_INFORMATION.
+//
+
+typedef struct _DISK_GROW_PARTITION {
+ ULONG PartitionNumber;
+ LARGE_INTEGER BytesToGrow;
+} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
+#endif /* _WIN32_WINNT >= 0x0500 */
+
+///////////////////////////////////////////////////////
+// //
+// The following structures define disk performance //
+// statistics: specifically the locations of all the //
+// reads and writes which have occured on the disk. //
+// //
+// To use these structures, you must issue an IOCTL_ //
+// DISK_HIST_STRUCTURE (with a DISK_HISTOGRAM) to //
+// obtain the basic histogram information. The //
+// number of buckets which must allocated is part of //
+// this structure. Allocate the required number of //
+// buckets and call an IOCTL_DISK_HIST_DATA to fill //
+// in the data //
+// //
+///////////////////////////////////////////////////////
+
+#define HIST_NO_OF_BUCKETS 24
+
+typedef struct _HISTOGRAM_BUCKET {
+ ULONG Reads;
+ ULONG Writes;
+} HISTOGRAM_BUCKET, *PHISTOGRAM_BUCKET;
+
+#define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET)
+
+typedef struct _DISK_HISTOGRAM {
+ LARGE_INTEGER DiskSize;
+ LARGE_INTEGER Start;
+ LARGE_INTEGER End;
+ LARGE_INTEGER Average;
+ LARGE_INTEGER AverageRead;
+ LARGE_INTEGER AverageWrite;
+ ULONG Granularity;
+ ULONG Size;
+ ULONG ReadCount;
+ ULONG WriteCount;
+ PHISTOGRAM_BUCKET Histogram;
+} DISK_HISTOGRAM, *PDISK_HISTOGRAM;
+
+#define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM)
+
+///////////////////////////////////////////////////////
+// //
+// The following structures define disk debugging //
+// capabilities. The IOCTLs are directed to one of //
+// the two disk filter drivers. //
+// //
+// DISKPERF is a utilty for collecting disk request //
+// statistics. //
+// //
+// SIMBAD is a utility for injecting faults in //
+// IO requests to disks. //
+// //
+///////////////////////////////////////////////////////
+
+//
+// The following structure is exchanged on an IOCTL_DISK_GET_PERFORMANCE
+// request. This ioctl collects summary disk request statistics used
+// in measuring performance.
+//
+
+typedef struct _DISK_PERFORMANCE {
+ LARGE_INTEGER BytesRead;
+ LARGE_INTEGER BytesWritten;
+ LARGE_INTEGER ReadTime;
+ LARGE_INTEGER WriteTime;
+ LARGE_INTEGER IdleTime;
+ ULONG ReadCount;
+ ULONG WriteCount;
+ ULONG QueueDepth;
+ ULONG SplitCount;
+ LARGE_INTEGER QueryTime;
+ ULONG StorageDeviceNumber;
+ WCHAR StorageManagerName[8];
+} DISK_PERFORMANCE, *PDISK_PERFORMANCE;
+
+//
+// This structure defines the disk logging record. When disk logging
+// is enabled, one of these is written to an internal buffer for each
+// disk request.
+//
+
+typedef struct _DISK_RECORD {
+ LARGE_INTEGER ByteOffset;
+ LARGE_INTEGER StartTime;
+ LARGE_INTEGER EndTime;
+ PVOID VirtualAddress;
+ ULONG NumberOfBytes;
+ UCHAR DeviceNumber;
+ BOOLEAN ReadRequest;
+} DISK_RECORD, *PDISK_RECORD;
+
+//
+// The following structure is exchanged on an IOCTL_DISK_LOG request.
+// Not all fields are valid with each function type.
+//
+
+typedef struct _DISK_LOGGING {
+ UCHAR Function;
+ PVOID BufferAddress;
+ ULONG BufferSize;
+} DISK_LOGGING, *PDISK_LOGGING;
+
+//
+// Disk logging functions
+//
+// Start disk logging. Only the Function and BufferSize fields are valid.
+//
+
+#define DISK_LOGGING_START 0
+
+//
+// Stop disk logging. Only the Function field is valid.
+//
+
+#define DISK_LOGGING_STOP 1
+
+//
+// Return disk log. All fields are valid. Data will be copied from internal
+// buffer to buffer specified for the number of bytes requested.
+//
+
+#define DISK_LOGGING_DUMP 2
+
+//
+// DISK BINNING
+//
+// DISKPERF will keep counters for IO that falls in each of these ranges.
+// The application determines the number and size of the ranges.
+// Joe Lin wanted me to keep it flexible as possible, for instance, IO
+// sizes are interesting in ranges like 0-4096, 4097-16384, 16385-65536, 65537+.
+//
+
+#define DISK_BINNING 3
+
+//
+// Bin types
+//
+
+typedef enum _BIN_TYPES {
+ RequestSize,
+ RequestLocation
+} BIN_TYPES;
+
+//
+// Bin ranges
+//
+
+typedef struct _BIN_RANGE {
+ LARGE_INTEGER StartValue;
+ LARGE_INTEGER Length;
+} BIN_RANGE, *PBIN_RANGE;
+
+//
+// Bin definition
+//
+
+typedef struct _PERF_BIN {
+ ULONG NumberOfBins;
+ ULONG TypeOfBin;
+ BIN_RANGE BinsRanges[1];
+} PERF_BIN, *PPERF_BIN ;
+
+//
+// Bin count
+//
+
+typedef struct _BIN_COUNT {
+ BIN_RANGE BinRange;
+ ULONG BinCount;
+} BIN_COUNT, *PBIN_COUNT;
+
+//
+// Bin results
+//
+
+typedef struct _BIN_RESULTS {
+ ULONG NumberOfBins;
+ BIN_COUNT BinCounts[1];
+} BIN_RESULTS, *PBIN_RESULTS;
+
+#if(_WIN32_WINNT >= 0x0400)
+//
+// Data structures for SMART drive fault prediction.
+//
+// GETVERSIONINPARAMS contains the data returned from the
+// Get Driver Version function.
+//
+
+#include <pshpack1.h>
+typedef struct _GETVERSIONINPARAMS {
+ UCHAR bVersion; // Binary driver version.
+ UCHAR bRevision; // Binary driver revision.
+ UCHAR bReserved; // Not used.
+ UCHAR bIDEDeviceMap; // Bit map of IDE devices.
+ ULONG fCapabilities; // Bit mask of driver capabilities.
+ ULONG dwReserved[4]; // For future use.
+} GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
+#include <poppack.h>
+
+//
+// Bits returned in the fCapabilities member of GETVERSIONINPARAMS
+//
+
+#define CAP_ATA_ID_CMD 1 // ATA ID command supported
+#define CAP_ATAPI_ID_CMD 2 // ATAPI ID command supported
+#define CAP_SMART_CMD 4 // SMART commannds supported
+
+//
+// IDE registers
+//
+
+#include <pshpack1.h>
+typedef struct _IDEREGS {
+ UCHAR bFeaturesReg; // Used for specifying SMART "commands".
+ UCHAR bSectorCountReg; // IDE sector count register
+ UCHAR bSectorNumberReg; // IDE sector number register
+ UCHAR bCylLowReg; // IDE low order cylinder value
+ UCHAR bCylHighReg; // IDE high order cylinder value
+ UCHAR bDriveHeadReg; // IDE drive/head register
+ UCHAR bCommandReg; // Actual IDE command.
+ UCHAR bReserved; // reserved for future use. Must be zero.
+} IDEREGS, *PIDEREGS, *LPIDEREGS;
+#include <poppack.h>
+
+//
+// Valid values for the bCommandReg member of IDEREGS.
+//
+
+#define ATAPI_ID_CMD 0xA1 // Returns ID sector for ATAPI.
+#define ID_CMD 0xEC // Returns ID sector for ATA.
+#define SMART_CMD 0xB0 // Performs SMART cmd.
+ // Requires valid bFeaturesReg,
+ // bCylLowReg, and bCylHighReg
+
+//
+// Cylinder register defines for SMART command
+//
+
+#define SMART_CYL_LOW 0x4F
+#define SMART_CYL_HI 0xC2
+
+
+//
+// SENDCMDINPARAMS contains the input parameters for the
+// Send Command to Drive function.
+//
+
+#include <pshpack1.h>
+typedef struct _SENDCMDINPARAMS {
+ ULONG cBufferSize; // Buffer size in bytes
+ IDEREGS irDriveRegs; // Structure with drive register values.
+ UCHAR bDriveNumber; // Physical drive number to send
+ // command to (0,1,2,3).
+ UCHAR bReserved[3]; // Reserved for future expansion.
+ ULONG dwReserved[4]; // For future use.
+ UCHAR bBuffer[1]; // Input buffer.
+} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
+#include <poppack.h>
+
+//
+// Status returned from driver
+//
+
+#include <pshpack1.h>
+typedef struct _DRIVERSTATUS {
+ UCHAR bDriverError; // Error code from driver,
+ // or 0 if no error.
+ UCHAR bIDEError; // Contents of IDE Error register.
+ // Only valid when bDriverError
+ // is SMART_IDE_ERROR.
+ UCHAR bReserved[2]; // Reserved for future expansion.
+ ULONG dwReserved[2]; // Reserved for future expansion.
+} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
+#include <poppack.h>
+
+//
+// bDriverError values
+//
+
+#define SMART_NO_ERROR 0 // No error
+#define SMART_IDE_ERROR 1 // Error from IDE controller
+#define SMART_INVALID_FLAG 2 // Invalid command flag
+#define SMART_INVALID_COMMAND 3 // Invalid command byte
+#define SMART_INVALID_BUFFER 4 // Bad buffer (null, invalid addr..)
+#define SMART_INVALID_DRIVE 5 // Drive number not valid
+#define SMART_INVALID_IOCTL 6 // Invalid IOCTL
+#define SMART_ERROR_NO_MEM 7 // Could not lock user's buffer
+#define SMART_INVALID_REGISTER 8 // Some IDE Register not valid
+#define SMART_NOT_SUPPORTED 9 // Invalid cmd flag set
+#define SMART_NO_IDE_DEVICE 10 // Cmd issued to device not present
+ // although drive number is valid
+//
+// SMART sub commands for execute offline diags
+//
+#define SMART_OFFLINE_ROUTINE_OFFLINE 0
+#define SMART_SHORT_SELFTEST_OFFLINE 1
+#define SMART_EXTENDED_SELFTEST_OFFLINE 2
+#define SMART_ABORT_OFFLINE_SELFTEST 127
+#define SMART_SHORT_SELFTEST_CAPTIVE 129
+#define SMART_EXTENDED_SELFTEST_CAPTIVE 130
+
+
+#include <pshpack1.h>
+typedef struct _SENDCMDOUTPARAMS {
+ ULONG cBufferSize; // Size of bBuffer in bytes
+ DRIVERSTATUS DriverStatus; // Driver status structure.
+ UCHAR bBuffer[1]; // Buffer of arbitrary length in which to store the data read from the // drive.
+} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
+#include <poppack.h>
+
+
+#define READ_ATTRIBUTE_BUFFER_SIZE 512
+#define IDENTIFY_BUFFER_SIZE 512
+#define READ_THRESHOLD_BUFFER_SIZE 512
+#define SMART_LOG_SECTOR_SIZE 512
+
+//
+// Feature register defines for SMART "sub commands"
+//
+
+#define READ_ATTRIBUTES 0xD0
+#define READ_THRESHOLDS 0xD1
+#define ENABLE_DISABLE_AUTOSAVE 0xD2
+#define SAVE_ATTRIBUTE_VALUES 0xD3
+#define EXECUTE_OFFLINE_DIAGS 0xD4
+#define SMART_READ_LOG 0xD5
+#define SMART_WRITE_LOG 0xd6
+#define ENABLE_SMART 0xD8
+#define DISABLE_SMART 0xD9
+#define RETURN_SMART_STATUS 0xDA
+#define ENABLE_DISABLE_AUTO_OFFLINE 0xDB
+#endif /* _WIN32_WINNT >= 0x0400 */
+
+
+// end_winioctl
+
+//
+// The following device control code is for the SIMBAD simulated bad
+// sector facility. See SIMBAD.H in this directory for related structures.
+//
+
+#define IOCTL_DISK_SIMBAD CTL_CODE(IOCTL_DISK_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+//
+// Queue link for mapped addresses stored for unmapping.
+//
+
+typedef struct _MAPPED_ADDRESS {
+ struct _MAPPED_ADDRESS *NextMappedAddress;
+ PVOID MappedAddress;
+ ULONG NumberOfBytes;
+ LARGE_INTEGER IoAddress;
+ ULONG BusNumber;
+} MAPPED_ADDRESS, *PMAPPED_ADDRESS;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _NTDDDISK_H_
+
diff --git a/include/winddk/ntddstor.h b/include/winddk/ntddstor.h
new file mode 100644
index 000000000..83f7fe019
--- /dev/null
+++ b/include/winddk/ntddstor.h
@@ -0,0 +1,748 @@
+/*++ BUILD Version: 0001 // Increment this if a change has global effects
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ ntddstor.h
+
+Abstract:
+
+ This is the include file that defines all common constants and types
+ accessing the storage class drivers
+
+Author:
+
+ Peter Wieland 19-Jun-1996
+
+Revision History:
+
+--*/
+
+#pragma once
+
+#include "devioctl.h"
+
+//
+// Interface GUIDs
+//
+// need these GUIDs outside conditional includes so that user can
+// #include <ntddstor.h> in precompiled header
+// #include <initguid.h> in a single source file
+// #include <ntddstor.h> in that source file a second time to instantiate the GUIDs
+//
+#ifdef DEFINE_GUID
+//
+// Make sure FAR is defined...
+//
+#ifndef FAR
+#ifdef _WIN32
+#define FAR
+#else
+#define FAR _far
+#endif
+#endif
+
+// begin_wioctlguids
+DEFINE_GUID(GUID_DEVINTERFACE_DISK, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_CDROM, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_PARTITION, 0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_TAPE, 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK, 0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_VOLUME, 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER, 0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY, 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER, 0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT, 0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+// end_wioctlguids
+
+// begin_wioctlobsoleteguids
+#define DiskClassGuid GUID_DEVINTERFACE_DISK
+#define CdRomClassGuid GUID_DEVINTERFACE_CDROM
+#define PartitionClassGuid GUID_DEVINTERFACE_PARTITION
+#define TapeClassGuid GUID_DEVINTERFACE_TAPE
+#define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK
+#define VolumeClassGuid GUID_DEVINTERFACE_VOLUME
+#define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER
+#define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY
+#define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER
+#define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT
+// end_wioctlobsoleteguids
+#endif
+
+// begin_winioctl
+
+#ifndef _NTDDSTOR_H_
+#define _NTDDSTOR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//
+// IoControlCode values for storage devices
+//
+
+#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
+
+//
+// The following device control codes are common for all class drivers. They
+// should be used in place of the older IOCTL_DISK, IOCTL_CDROM and IOCTL_TAPE
+// common codes
+//
+
+#define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_GET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_SET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_BREAK_RESERVATION CTL_CODE(IOCTL_STORAGE_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+// end_winioctl
+
+
+#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+
+// begin_winioctl
+
+//
+// These ioctl codes are obsolete. They are defined here to avoid resuing them
+// and to allow class drivers to respond to them more easily.
+//
+
+#define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+
+//
+// IOCTL_STORAGE_GET_HOTPLUG_INFO
+//
+
+typedef struct _STORAGE_HOTPLUG_INFO {
+ ULONG Size; // version
+ BOOLEAN MediaRemovable; // ie. zip, jaz, cdrom, mo, etc. vs hdd
+ BOOLEAN MediaHotplug; // ie. does the device succeed a lock even though its not lockable media?
+ BOOLEAN DeviceHotplug; // ie. 1394, USB, etc.
+ BOOLEAN WriteCacheEnableOverride; // This field should not be relied upon because it is no longer used
+} STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
+
+//
+// IOCTL_STORAGE_GET_DEVICE_NUMBER
+//
+// input - none
+//
+// output - STORAGE_DEVICE_NUMBER structure
+// The values in the STORAGE_DEVICE_NUMBER structure are guaranteed
+// to remain unchanged until the system is rebooted. They are not
+// guaranteed to be persistant across boots.
+//
+
+typedef struct _STORAGE_DEVICE_NUMBER {
+
+ //
+ // The FILE_DEVICE_XXX type for this device.
+ //
+
+ DEVICE_TYPE DeviceType;
+
+ //
+ // The number of this device
+ //
+
+ ULONG DeviceNumber;
+
+ //
+ // If the device is partitionable, the partition number of the device.
+ // Otherwise -1
+ //
+
+ ULONG PartitionNumber;
+} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
+
+//
+// Define the structures for scsi resets
+//
+
+typedef struct _STORAGE_BUS_RESET_REQUEST {
+ UCHAR PathId;
+} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
+
+//
+// IOCTL_STORAGE_MEDIA_REMOVAL disables the mechanism
+// on a storage device that ejects media. This function
+// may or may not be supported on storage devices that
+// support removable media.
+//
+// TRUE means prevent media from being removed.
+// FALSE means allow media removal.
+//
+
+typedef struct _PREVENT_MEDIA_REMOVAL {
+ BOOLEAN PreventMediaRemoval;
+} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
+
+// begin_ntminitape
+
+
+typedef struct _TAPE_STATISTICS {
+ ULONG Version;
+ ULONG Flags;
+ LARGE_INTEGER RecoveredWrites;
+ LARGE_INTEGER UnrecoveredWrites;
+ LARGE_INTEGER RecoveredReads;
+ LARGE_INTEGER UnrecoveredReads;
+ UCHAR CompressionRatioReads;
+ UCHAR CompressionRatioWrites;
+} TAPE_STATISTICS, *PTAPE_STATISTICS;
+
+#define RECOVERED_WRITES_VALID 0x00000001
+#define UNRECOVERED_WRITES_VALID 0x00000002
+#define RECOVERED_READS_VALID 0x00000004
+#define UNRECOVERED_READS_VALID 0x00000008
+#define WRITE_COMPRESSION_INFO_VALID 0x00000010
+#define READ_COMPRESSION_INFO_VALID 0x00000020
+
+typedef struct _TAPE_GET_STATISTICS {
+ ULONG Operation;
+} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
+
+#define TAPE_RETURN_STATISTICS 0L
+#define TAPE_RETURN_ENV_INFO 1L
+#define TAPE_RESET_STATISTICS 2L
+
+//
+// IOCTL_STORAGE_GET_MEDIA_TYPES_EX will return an array of DEVICE_MEDIA_INFO
+// structures, one per supported type, embedded in the GET_MEDIA_TYPES struct.
+//
+
+typedef enum _STORAGE_MEDIA_TYPE {
+ //
+ // Following are defined in ntdddisk.h in the MEDIA_TYPE enum
+ //
+ // Unknown, // Format is unknown
+ // F5_1Pt2_512, // 5.25", 1.2MB, 512 bytes/sector
+ // F3_1Pt44_512, // 3.5", 1.44MB, 512 bytes/sector
+ // F3_2Pt88_512, // 3.5", 2.88MB, 512 bytes/sector
+ // F3_20Pt8_512, // 3.5", 20.8MB, 512 bytes/sector
+ // F3_720_512, // 3.5", 720KB, 512 bytes/sector
+ // F5_360_512, // 5.25", 360KB, 512 bytes/sector
+ // F5_320_512, // 5.25", 320KB, 512 bytes/sector
+ // F5_320_1024, // 5.25", 320KB, 1024 bytes/sector
+ // F5_180_512, // 5.25", 180KB, 512 bytes/sector
+ // F5_160_512, // 5.25", 160KB, 512 bytes/sector
+ // RemovableMedia, // Removable media other than floppy
+ // FixedMedia, // Fixed hard disk media
+ // F3_120M_512, // 3.5", 120M Floppy
+ // F3_640_512, // 3.5" , 640KB, 512 bytes/sector
+ // F5_640_512, // 5.25", 640KB, 512 bytes/sector
+ // F5_720_512, // 5.25", 720KB, 512 bytes/sector
+ // F3_1Pt2_512, // 3.5" , 1.2Mb, 512 bytes/sector
+ // F3_1Pt23_1024, // 3.5" , 1.23Mb, 1024 bytes/sector
+ // F5_1Pt23_1024, // 5.25", 1.23MB, 1024 bytes/sector
+ // F3_128Mb_512, // 3.5" MO 128Mb 512 bytes/sector
+ // F3_230Mb_512, // 3.5" MO 230Mb 512 bytes/sector
+ // F8_256_128, // 8", 256KB, 128 bytes/sector
+ // F3_200Mb_512, // 3.5", 200M Floppy (HiFD)
+ //
+
+ DDS_4mm = 0x20, // Tape - DAT DDS1,2,... (all vendors)
+ MiniQic, // Tape - miniQIC Tape
+ Travan, // Tape - Travan TR-1,2,3,...
+ QIC, // Tape - QIC
+ MP_8mm, // Tape - 8mm Exabyte Metal Particle
+ AME_8mm, // Tape - 8mm Exabyte Advanced Metal Evap
+ AIT1_8mm, // Tape - 8mm Sony AIT
+ DLT, // Tape - DLT Compact IIIxt, IV
+ NCTP, // Tape - Philips NCTP
+ IBM_3480, // Tape - IBM 3480
+ IBM_3490E, // Tape - IBM 3490E
+ IBM_Magstar_3590, // Tape - IBM Magstar 3590
+ IBM_Magstar_MP, // Tape - IBM Magstar MP
+ STK_DATA_D3, // Tape - STK Data D3
+ SONY_DTF, // Tape - Sony DTF
+ DV_6mm, // Tape - 6mm Digital Video
+ DMI, // Tape - Exabyte DMI and compatibles
+ SONY_D2, // Tape - Sony D2S and D2L
+ CLEANER_CARTRIDGE, // Cleaner - All Drive types that support Drive Cleaners
+ CD_ROM, // Opt_Disk - CD
+ CD_R, // Opt_Disk - CD-Recordable (Write Once)
+ CD_RW, // Opt_Disk - CD-Rewriteable
+ DVD_ROM, // Opt_Disk - DVD-ROM
+ DVD_R, // Opt_Disk - DVD-Recordable (Write Once)
+ DVD_RW, // Opt_Disk - DVD-Rewriteable
+ MO_3_RW, // Opt_Disk - 3.5" Rewriteable MO Disk
+ MO_5_WO, // Opt_Disk - MO 5.25" Write Once
+ MO_5_RW, // Opt_Disk - MO 5.25" Rewriteable (not LIMDOW)
+ MO_5_LIMDOW, // Opt_Disk - MO 5.25" Rewriteable (LIMDOW)
+ PC_5_WO, // Opt_Disk - Phase Change 5.25" Write Once Optical
+ PC_5_RW, // Opt_Disk - Phase Change 5.25" Rewriteable
+ PD_5_RW, // Opt_Disk - PhaseChange Dual Rewriteable
+ ABL_5_WO, // Opt_Disk - Ablative 5.25" Write Once Optical
+ PINNACLE_APEX_5_RW, // Opt_Disk - Pinnacle Apex 4.6GB Rewriteable Optical
+ SONY_12_WO, // Opt_Disk - Sony 12" Write Once
+ PHILIPS_12_WO, // Opt_Disk - Philips/LMS 12" Write Once
+ HITACHI_12_WO, // Opt_Disk - Hitachi 12" Write Once
+ CYGNET_12_WO, // Opt_Disk - Cygnet/ATG 12" Write Once
+ KODAK_14_WO, // Opt_Disk - Kodak 14" Write Once
+ MO_NFR_525, // Opt_Disk - Near Field Recording (Terastor)
+ NIKON_12_RW, // Opt_Disk - Nikon 12" Rewriteable
+ IOMEGA_ZIP, // Mag_Disk - Iomega Zip
+ IOMEGA_JAZ, // Mag_Disk - Iomega Jaz
+ SYQUEST_EZ135, // Mag_Disk - Syquest EZ135
+ SYQUEST_EZFLYER, // Mag_Disk - Syquest EzFlyer
+ SYQUEST_SYJET, // Mag_Disk - Syquest SyJet
+ AVATAR_F2, // Mag_Disk - 2.5" Floppy
+ MP2_8mm, // Tape - 8mm Hitachi
+ DST_S, // Ampex DST Small Tapes
+ DST_M, // Ampex DST Medium Tapes
+ DST_L, // Ampex DST Large Tapes
+ VXATape_1, // Ecrix 8mm Tape
+ VXATape_2, // Ecrix 8mm Tape
+ STK_9840, // STK 9840
+ LTO_Ultrium, // IBM, HP, Seagate LTO Ultrium
+ LTO_Accelis, // IBM, HP, Seagate LTO Accelis
+ DVD_RAM, // Opt_Disk - DVD-RAM
+ AIT_8mm, // AIT2 or higher
+ ADR_1, // OnStream ADR Mediatypes
+ ADR_2
+} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
+
+#define MEDIA_ERASEABLE 0x00000001
+#define MEDIA_WRITE_ONCE 0x00000002
+#define MEDIA_READ_ONLY 0x00000004
+#define MEDIA_READ_WRITE 0x00000008
+
+#define MEDIA_WRITE_PROTECTED 0x00000100
+#define MEDIA_CURRENTLY_MOUNTED 0x80000000
+
+//
+// Define the different storage bus types
+// Bus types below 128 (0x80) are reserved for Microsoft use
+//
+
+typedef enum _STORAGE_BUS_TYPE {
+ BusTypeUnknown = 0x00,
+ BusTypeScsi,
+ BusTypeAtapi,
+ BusTypeAta,
+ BusType1394,
+ BusTypeSsa,
+ BusTypeFibre,
+ BusTypeUsb,
+ BusTypeRAID,
+ BusTypeMaxReserved = 0x7F
+} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
+
+typedef struct _DEVICE_MEDIA_INFO {
+ union {
+ struct {
+ LARGE_INTEGER Cylinders;
+ STORAGE_MEDIA_TYPE MediaType;
+ ULONG TracksPerCylinder;
+ ULONG SectorsPerTrack;
+ ULONG BytesPerSector;
+ ULONG NumberMediaSides;
+ ULONG MediaCharacteristics; // Bitmask of MEDIA_XXX values.
+ } DiskInfo;
+
+ struct {
+ LARGE_INTEGER Cylinders;
+ STORAGE_MEDIA_TYPE MediaType;
+ ULONG TracksPerCylinder;
+ ULONG SectorsPerTrack;
+ ULONG BytesPerSector;
+ ULONG NumberMediaSides;
+ ULONG MediaCharacteristics; // Bitmask of MEDIA_XXX values.
+ } RemovableDiskInfo;
+
+ struct {
+ STORAGE_MEDIA_TYPE MediaType;
+ ULONG MediaCharacteristics; // Bitmask of MEDIA_XXX values.
+ ULONG CurrentBlockSize;
+ STORAGE_BUS_TYPE BusType;
+
+ //
+ // Bus specific information describing the medium supported.
+ //
+
+ union {
+ struct {
+ UCHAR MediumType;
+ UCHAR DensityCode;
+ } ScsiInformation;
+ } BusSpecificData;
+
+ } TapeInfo;
+ } DeviceSpecific;
+} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
+
+typedef struct _GET_MEDIA_TYPES {
+ ULONG DeviceType; // FILE_DEVICE_XXX values
+ ULONG MediaInfoCount;
+ DEVICE_MEDIA_INFO MediaInfo[1];
+} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
+
+
+//
+// IOCTL_STORAGE_PREDICT_FAILURE
+//
+// input - none
+//
+// output - STORAGE_PREDICT_FAILURE structure
+// PredictFailure returns zero if no failure predicted and non zero
+// if a failure is predicted.
+//
+// VendorSpecific returns 512 bytes of vendor specific information
+// if a failure is predicted
+//
+typedef struct _STORAGE_PREDICT_FAILURE
+{
+ ULONG PredictFailure;
+ UCHAR VendorSpecific[512];
+} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
+
+// end_ntminitape
+// end_winioctl
+
+//
+// Property Query Structures
+//
+
+//
+// IOCTL_STORAGE_QUERY_PROPERTY
+//
+// Input Buffer:
+// a STORAGE_PROPERTY_QUERY structure which describes what type of query
+// is being done, what property is being queried for, and any additional
+// parameters which a particular property query requires.
+//
+// Output Buffer:
+// Contains a buffer to place the results of the query into. Since all
+// property descriptors can be cast into a STORAGE_DESCRIPTOR_HEADER,
+// the IOCTL can be called once with a small buffer then again using
+// a buffer as large as the header reports is necessary.
+//
+
+
+//
+// Types of queries
+//
+
+typedef enum _STORAGE_QUERY_TYPE {
+ PropertyStandardQuery = 0, // Retrieves the descriptor
+ PropertyExistsQuery, // Used to test whether the descriptor is supported
+ PropertyMaskQuery, // Used to retrieve a mask of writeable fields in the descriptor
+ PropertyQueryMaxDefined // use to validate the value
+} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
+
+//
+// define some initial property id's
+//
+
+typedef enum _STORAGE_PROPERTY_ID {
+ StorageDeviceProperty = 0,
+ StorageAdapterProperty,
+ StorageDeviceIdProperty
+} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
+
+//
+// Query structure - additional parameters for specific queries can follow
+// the header
+//
+
+typedef struct _STORAGE_PROPERTY_QUERY {
+
+ //
+ // ID of the property being retrieved
+ //
+
+ STORAGE_PROPERTY_ID PropertyId;
+
+ //
+ // Flags indicating the type of query being performed
+ //
+
+ STORAGE_QUERY_TYPE QueryType;
+
+ //
+ // Space for additional parameters if necessary
+ //
+
+ UCHAR AdditionalParameters[1];
+
+} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
+
+//
+// Standard property descriptor header. All property pages should use this
+// as their first element or should contain these two elements
+//
+
+typedef struct _STORAGE_DESCRIPTOR_HEADER {
+
+ ULONG Version;
+
+ ULONG Size;
+
+} STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
+
+//
+// Device property descriptor - this is really just a rehash of the inquiry
+// data retrieved from a scsi device
+//
+// This may only be retrieved from a target device. Sending this to the bus
+// will result in an error
+//
+
+typedef struct _STORAGE_DEVICE_DESCRIPTOR {
+
+ //
+ // Sizeof(STORAGE_DEVICE_DESCRIPTOR)
+ //
+
+ ULONG Version;
+
+ //
+ // Total size of the descriptor, including the space for additional
+ // data and id strings
+ //
+
+ ULONG Size;
+
+ //
+ // The SCSI-2 device type
+ //
+
+ UCHAR DeviceType;
+
+ //
+ // The SCSI-2 device type modifier (if any) - this may be zero
+ //
+
+ UCHAR DeviceTypeModifier;
+
+ //
+ // Flag indicating whether the device's media (if any) is removable. This
+ // field should be ignored for media-less devices
+ //
+
+ BOOLEAN RemovableMedia;
+
+ //
+ // Flag indicating whether the device can support mulitple outstanding
+ // commands. The actual synchronization in this case is the responsibility
+ // of the port driver.
+ //
+
+ BOOLEAN CommandQueueing;
+
+ //
+ // Byte offset to the zero-terminated ascii string containing the device's
+ // vendor id string. For devices with no such ID this will be zero
+ //
+
+ ULONG VendorIdOffset;
+
+ //
+ // Byte offset to the zero-terminated ascii string containing the device's
+ // product id string. For devices with no such ID this will be zero
+ //
+
+ ULONG ProductIdOffset;
+
+ //
+ // Byte offset to the zero-terminated ascii string containing the device's
+ // product revision string. For devices with no such string this will be
+ // zero
+ //
+
+ ULONG ProductRevisionOffset;
+
+ //
+ // Byte offset to the zero-terminated ascii string containing the device's
+ // serial number. For devices with no serial number this will be zero
+ //
+
+ ULONG SerialNumberOffset;
+
+ //
+ // Contains the bus type (as defined above) of the device. It should be
+ // used to interpret the raw device properties at the end of this structure
+ // (if any)
+ //
+
+ STORAGE_BUS_TYPE BusType;
+
+ //
+ // The number of bytes of bus-specific data which have been appended to
+ // this descriptor
+ //
+
+ ULONG RawPropertiesLength;
+
+ //
+ // Place holder for the first byte of the bus specific property data
+ //
+
+ UCHAR RawDeviceProperties[1];
+
+} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
+
+
+//
+// Adapter properties
+//
+// This descriptor can be retrieved from a target device object of from the
+// device object for the bus. Retrieving from the target device object will
+// forward the request to the underlying bus
+//
+
+typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
+
+ ULONG Version;
+
+ ULONG Size;
+
+ ULONG MaximumTransferLength;
+
+ ULONG MaximumPhysicalPages;
+
+ ULONG AlignmentMask;
+
+ BOOLEAN AdapterUsesPio;
+
+ BOOLEAN AdapterScansDown;
+
+ BOOLEAN CommandQueueing;
+
+ BOOLEAN AcceleratedTransfer;
+
+ UCHAR BusType;
+
+ USHORT BusMajorVersion;
+
+ USHORT BusMinorVersion;
+
+} STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
+
+//
+// Storage identification descriptor.
+// The definitions here are based on the SCSI/SBP vital product data
+// device identifier page.
+//
+
+typedef enum _STORAGE_IDENTIFIER_CODE_SET {
+ StorageIdCodeSetReserved = 0,
+ StorageIdCodeSetBinary = 1,
+ StorageIdCodeSetAscii = 2
+} STORAGE_IDENTIFIER_CODE_SET, *PSTORAGE_IDENTIFIER_CODE_SET;
+
+typedef enum _STORAGE_IDENTIFIER_TYPE {
+ StorageIdTypeVendorSpecific = 0,
+ StorageIdTypeVendorId = 1,
+ StorageIdTypeEUI64 = 2,
+ StorageIdTypeFCPHName = 3,
+ StorageIdTypePortRelative = 4
+} STORAGE_IDENTIFIER_TYPE, *PSTORAGE_IDENTIFIER_TYPE;
+
+typedef enum _STORAGE_ASSOCIATION_TYPE {
+ StorageIdAssocDevice = 0,
+ StorageIdAssocPort = 1
+} STORAGE_ASSOCIATION_TYPE, *PSTORAGE_ASSOCIATION_TYPE;
+
+typedef struct _STORAGE_IDENTIFIER {
+ STORAGE_IDENTIFIER_CODE_SET CodeSet;
+ STORAGE_IDENTIFIER_TYPE Type;
+ USHORT IdentifierSize;
+ USHORT NextOffset;
+
+ //
+ // Add new fields here since existing code depends on
+ // the above layout not changing.
+ //
+
+ STORAGE_ASSOCIATION_TYPE Association;
+
+ //
+ // The identifier is a variable length array of bytes.
+ //
+
+ UCHAR Identifier[1];
+} STORAGE_IDENTIFIER, *PSTORAGE_IDENTIFIER;
+
+typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
+
+ ULONG Version;
+
+ ULONG Size;
+
+ //
+ // The number of identifiers reported by the device.
+ //
+
+ ULONG NumberOfIdentifiers;
+
+ //
+ // The following field is actually a variable length array of identification
+ // descriptors. Unfortunately there's no C notation for an array of
+ // variable length structures so we're forced to just pretend.
+ //
+
+ UCHAR Identifiers[1];
+} STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
+
+
+#pragma warning(push)
+#pragma warning(disable:4200)
+typedef struct _STORAGE_MEDIA_SERIAL_NUMBER_DATA {
+
+ USHORT Reserved;
+
+ //
+ // the SerialNumberLength will be set to zero
+ // if the command is supported and the media
+ // does not have a valid serial number.
+ //
+
+ USHORT SerialNumberLength;
+
+ //
+ // the following data is binary, and is not guaranteed
+ // to be NULL terminated. this is an excercise for the
+ // caller.
+ //
+
+ UCHAR SerialNumber[0];
+
+} STORAGE_MEDIA_SERIAL_NUMBER_DATA, *PSTORAGE_MEDIA_SERIAL_NUMBER_DATA;
+#pragma warning(push)
+
+
+// begin_winioctl
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _NTDDSTOR_H_
+// end_winioctl
+