/* ImDisk Virtual Disk Driver for Windows NT/2000/XP. Copyright (C) 2005-2018 Olof Lagerkvist. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _INC_IMDISK_ #define _INC_IMDISK_ #ifndef __T #if defined(_NTDDK_) || defined(UNICODE) || defined(_UNICODE) #define __T(x) L ## x #else #define __T(x) x #endif #endif #ifndef _T #define _T(x) __T(x) #endif #include "imdiskver.h" #define IMDISK_VERSION ((IMDISK_MAJOR_VERSION << 8) | (IMDISK_MINOR_VERSION << 4) | (IMDISK_MINOR_LOW_VERSION)) #define IMDISK_DRIVER_VERSION 0x0103 #ifndef ZERO_STRUCT #define ZERO_STRUCT { 0 } #endif /// /// Base names for device objects created in \Device /// #define IMDISK_DEVICE_DIR_NAME _T("\\Device") #define IMDISK_DEVICE_BASE_NAME IMDISK_DEVICE_DIR_NAME _T("\\ImDisk") #define IMDISK_CTL_DEVICE_NAME IMDISK_DEVICE_BASE_NAME _T("Ctl") /// /// Symlinks created in \DosDevices to device objects /// #define IMDISK_SYMLNK_NATIVE_DIR_NAME _T("\\DosDevices") #define IMDISK_SYMLNK_WIN32_DIR_NAME _T("\\\\?") #define IMDISK_SYMLNK_NATIVE_BASE_NAME IMDISK_SYMLNK_NATIVE_DIR_NAME _T("\\ImDisk") #define IMDISK_SYMLNK_WIN32_BASE_NAME IMDISK_SYMLNK_WIN32_DIR_NAME _T("\\ImDisk") #define IMDISK_CTL_SYMLINK_NAME IMDISK_SYMLNK_NATIVE_BASE_NAME _T("Ctl") #define IMDISK_CTL_DOSDEV_NAME IMDISK_SYMLNK_WIN32_BASE_NAME _T("Ctl") /// /// The driver name and image path /// #define IMDISK_DRIVER_NAME _T("ImDisk") #define IMDISK_DRIVER_PATH _T("system32\\drivers\\imdisk.sys") #ifndef AWEALLOC_DRIVER_NAME #define AWEALLOC_DRIVER_NAME _T("AWEAlloc") #endif #ifndef AWEALLOC_DEVICE_NAME #define AWEALLOC_DEVICE_NAME _T("\\Device\\") AWEALLOC_DRIVER_NAME #endif /// /// Global refresh event name /// #define IMDISK_REFRESH_EVENT_NAME _T("ImDiskRefresh") /// /// Registry settings. It is possible to specify devices to be mounted /// automatically when the driver loads. /// #define IMDISK_CFG_PARAMETER_KEY _T("\\Parameters") #define IMDISK_CFG_MAX_DEVICES_VALUE _T("MaxDevices") #define IMDISK_CFG_LOAD_DEVICES_VALUE _T("LoadDevices") #define IMDISK_CFG_DISALLOWED_DRIVE_LETTERS_VALUE _T("DisallowedDriveLetters") #define IMDISK_CFG_IMAGE_FILE_PREFIX _T("FileName") #define IMDISK_CFG_SIZE_PREFIX _T("Size") #define IMDISK_CFG_FLAGS_PREFIX _T("Flags") #define IMDISK_CFG_DRIVE_LETTER_PREFIX _T("DriveLetter") #define IMDISK_CFG_OFFSET_PREFIX _T("ImageOffset") #define KEY_NAME_HKEY_MOUNTPOINTS \ _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints") #define KEY_NAME_HKEY_MOUNTPOINTS2 \ _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2") #define IMDISK_WINVER_MAJOR() (GetVersion() & 0xFF) #define IMDISK_WINVER_MINOR() ((GetVersion() & 0xFF00) >> 8) #define IMDISK_WINVER() ((IMDISK_WINVER_MAJOR() << 8) | \ IMDISK_WINVER_MINOR()) #if defined(NT4_COMPATIBLE) && !defined(_WIN64) #define IMDISK_GTE_WIN2K() (IMDISK_WINVER_MAJOR() >= 0x05) #else #define IMDISK_GTE_WIN2K() TRUE #endif #ifdef _WIN64 #define IMDISK_GTE_WINXP() TRUE #else #define IMDISK_GTE_WINXP() (IMDISK_WINVER() >= 0x0501) #endif #define IMDISK_GTE_SRV2003() (IMDISK_WINVER() >= 0x0502) #define IMDISK_GTE_VISTA() (IMDISK_WINVER_MAJOR() >= 0x06) #ifndef IMDISK_API #ifdef IMDISK_CPL_EXPORTS #define IMDISK_API __declspec(dllexport) #else #define IMDISK_API __declspec(dllimport) #endif #endif /// /// Base value for the IOCTL's. /// #define FILE_DEVICE_IMDISK 0x8372 #define IOCTL_IMDISK_QUERY_VERSION ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x800, METHOD_BUFFERED, 0)) #define IOCTL_IMDISK_CREATE_DEVICE ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)) #define IOCTL_IMDISK_QUERY_DEVICE ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x802, METHOD_BUFFERED, 0)) #define IOCTL_IMDISK_QUERY_DRIVER ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x803, METHOD_BUFFERED, 0)) #define IOCTL_IMDISK_REFERENCE_HANDLE ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x804, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)) #define IOCTL_IMDISK_SET_DEVICE_FLAGS ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x805, METHOD_BUFFERED, 0)) #define IOCTL_IMDISK_REMOVE_DEVICE ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x806, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)) #define IOCTL_IMDISK_IOCTL_PASS_THROUGH ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x807, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)) #define IOCTL_IMDISK_FSCTL_PASS_THROUGH ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x808, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)) #define IOCTL_IMDISK_GET_REFERENCED_HANDLE ((ULONG) CTL_CODE(FILE_DEVICE_IMDISK, 0x809, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)) /// /// Bit constants for the Flags field in IMDISK_CREATE_DATA /// /// Read-only device #define IMDISK_OPTION_RO 0x00000001 /// Check if flags specifies read-only #define IMDISK_READONLY(x) ((ULONG)(x) & 0x00000001) /// Removable, hot-plug, device #define IMDISK_OPTION_REMOVABLE 0x00000002 /// Check if flags specifies removable #define IMDISK_REMOVABLE(x) ((ULONG)(x) & 0x00000002) /// Specifies that image file is created with sparse attribute. #define IMDISK_OPTION_SPARSE_FILE 0x00000004 /// Check if flags specifies sparse #define IMDISK_SPARSE_FILE(x) ((ULONG)(x) & 0x00000004) /// Swaps each byte pair in image file. #define IMDISK_OPTION_BYTE_SWAP 0x00000008 /// Check if flags specifies byte swapping #define IMDISK_BYTE_SWAP(x) ((ULONG)(x) & 0x00000008) /// Device type is virtual harddisk partition #define IMDISK_DEVICE_TYPE_HD 0x00000010 /// Device type is virtual floppy drive #define IMDISK_DEVICE_TYPE_FD 0x00000020 /// Device type is virtual CD/DVD-ROM drive #define IMDISK_DEVICE_TYPE_CD 0x00000030 /// Device type is unknown "raw" (for use with third-party client drivers) #define IMDISK_DEVICE_TYPE_RAW 0x00000040 /// Extracts the IMDISK_DEVICE_TYPE_xxx from flags #define IMDISK_DEVICE_TYPE(x) ((ULONG)(x) & 0x000000F0) /// Virtual disk is backed by image file #define IMDISK_TYPE_FILE 0x00000100 /// Virtual disk is backed by virtual memory #define IMDISK_TYPE_VM 0x00000200 /// Virtual disk is backed by proxy connection #define IMDISK_TYPE_PROXY 0x00000300 /// Extracts the IMDISK_TYPE_xxx from flags #define IMDISK_TYPE(x) ((ULONG)(x) & 0x00000F00) // Types with proxy mode /// Proxy connection is direct-type #define IMDISK_PROXY_TYPE_DIRECT 0x00000000 /// Proxy connection is over serial line #define IMDISK_PROXY_TYPE_COMM 0x00001000 /// Proxy connection is over TCP/IP #define IMDISK_PROXY_TYPE_TCP 0x00002000 /// Proxy connection uses shared memory #define IMDISK_PROXY_TYPE_SHM 0x00003000 /// Extracts the IMDISK_PROXY_TYPE_xxx from flags #define IMDISK_PROXY_TYPE(x) ((ULONG)(x) & 0x0000F000) // Types with file mode /// Serialized I/O to an image file, done in a worker thread #define IMDISK_FILE_TYPE_QUEUED_IO 0x00000000 /// Direct parallel I/O to AWEAlloc driver (physical RAM), done in request /// thread #define IMDISK_FILE_TYPE_AWEALLOC 0x00001000 /// Direct parallel I/O to an image file, done in request thread #define IMDISK_FILE_TYPE_PARALLEL_IO 0x00002000 /// Extracts the IMDISK_FILE_TYPE_xxx from flags #define IMDISK_FILE_TYPE(x) ((ULONG)(x) & 0x0000F000) /// Flag set by write request dispatchers to indicated that virtual disk has /// been since mounted #define IMDISK_IMAGE_MODIFIED 0x00010000 // 0x00020000 is reserved. Corresponds to IMSCSI_FAKE_DISK_SIG in // Arsenal Image Mounter. /// This flag causes the driver to open image files in shared write mode even /// if the image is opened for writing. This could be useful in some cases, /// but could easily corrupt filesystems on image files if used incorrectly. #define IMDISK_OPTION_SHARED_IMAGE 0x00040000 /// Check if flags indicate shared write mode #define IMDISK_SHARED_IMAGE(x) ((ULONG)(x) & 0x00040000) /// Macro to determine if flags specify either virtual memory (type vm) or /// physical memory (type file with awealloc) virtual disk drive #define IMDISK_IS_MEMORY_DRIVE(x) \ ((IMDISK_TYPE(x) == IMDISK_TYPE_VM) || \ ((IMDISK_TYPE(x) == IMDISK_TYPE_FILE) && \ (IMDISK_FILE_TYPE(x) == IMDISK_FILE_TYPE_AWEALLOC))) /// Specify as device number to automatically select first free. #define IMDISK_AUTO_DEVICE_NUMBER ((ULONG)-1) /** Structure used by the IOCTL_IMDISK_CREATE_DEVICE and IOCTL_IMDISK_QUERY_DEVICE calls and by the ImDiskQueryDevice function. */ typedef struct _IMDISK_CREATE_DATA { /// On create this can be set to IMDISK_AUTO_DEVICE_NUMBER ULONG DeviceNumber; /// Total size in bytes (in the Cylinders field) and virtual geometry. DISK_GEOMETRY DiskGeometry; /// The byte offset in the image file where the virtual disk begins. LARGE_INTEGER ImageOffset; /// Creation flags. Type of device and type of connection. ULONG Flags; /// Drive letter (if used, otherwise zero). WCHAR DriveLetter; /// Length in bytes of the FileName member. USHORT FileNameLength; /// Dynamically-sized member that specifies the image file name. WCHAR FileName[1]; } IMDISK_CREATE_DATA, *PIMDISK_CREATE_DATA; typedef struct _IMDISK_SET_DEVICE_FLAGS { ULONG FlagsToChange; ULONG FlagValues; } IMDISK_SET_DEVICE_FLAGS, *PIMDISK_SET_DEVICE_FLAGS; #define IMDISK_API_NO_BROADCAST_NOTIFY 0x00000001 #define IMDISK_API_FORCE_DISMOUNT 0x00000002 #pragma pack(push) #pragma pack(1) typedef struct _FAT_BPB { USHORT BytesPerSector; UCHAR SectorsPerCluster; USHORT ReservedSectors; UCHAR NumberOfFileAllocationTables; USHORT NumberOfRootEntries; USHORT NumberOfSectors; UCHAR MediaDescriptor; USHORT SectorsPerFileAllocationTable; USHORT SectorsPerTrack; USHORT NumberOfHeads; union { struct { USHORT NumberOfHiddenSectors; USHORT TotalNumberOfSectors; } DOS_320; struct { ULONG NumberOfHiddenSectors; ULONG TotalNumberOfSectors; } DOS_331; }; } FAT_BPB, *PFAT_BPB; typedef struct _FAT_VBR { UCHAR JumpInstruction[3]; CHAR OEMName[8]; FAT_BPB BPB; UCHAR FillData[512 - 3 - 8 - sizeof(FAT_BPB) - 1 - 2]; UCHAR PhysicalDriveNumber; UCHAR Signature[2]; } FAT_VBR, *PFAT_VBR; #pragma warning(push) #pragma warning(disable: 4214) typedef struct _MBR_PARTITION_TABLE_ENTRY { UCHAR Zero : 7; UCHAR BootIndicator : 1; UCHAR StartCHS[3]; UCHAR PartitionType; UCHAR EndCHS[3]; ULONG StartingSector; ULONG NumberOfSectors; } MBR_PARTITION_TABLE_ENTRY, *PMBR_PARTITION_TABLE_ENTRY; #pragma warning(pop) typedef struct _MBR_PARTITION_TABLE { MBR_PARTITION_TABLE_ENTRY PartitionEntry[4]; USHORT Signature; // == 0xAA55 } MBR_PARTITION_TABLE, *PMBR_PARTITION_TABLE; #pragma pack(pop) #ifdef WINAPI #ifdef __cplusplus extern "C" { #endif /** Get behaviour flags for API. */ IMDISK_API ULONGLONG WINAPI ImDiskGetAPIFlags(); /** Set behaviour flags for API. Returns previously defined flag field. Flags New flags value to set. */ IMDISK_API ULONGLONG WINAPI ImDiskSetAPIFlags(ULONGLONG Flags); /** An interactive rundll32.exe-compatible function to show the Add New Virtual Disk dialog box with a file name already filled in. It is used by the Windows Explorer context menus. hWnd Specifies a window that will be the owner window of any MessageBox:es or similar. hInst Ignored. lpszCmdLine An ANSI string specifying the image file to mount. nCmdShow Ignored. */ IMDISK_API void WINAPI RunDLL_MountFile(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow); /** An interactive rundll32.exe-compatible function to remove an existing ImDisk virtual disk. If the filesystem on the device cannot be locked and dismounted a MessageBox is displayed that asks the user if dismount should be forced. hWnd Specifies a window that will be the owner window of any MessageBox:es or similar. hInst Ignored. lpszCmdLine An ANSI string specifying the virtual disk to remove. This can be on the form "F:" or "F:\" (without the quotes). nCmdShow Ignored. */ IMDISK_API void WINAPI RunDLL_RemoveDevice(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow); /** An interactive rundll32.exe-compatible function to save a virtual or physical drive as an image file. If the filesystem on the device cannot be locked and dismounted a MessageBox is displayed that asks the user if the image saving should continue anyway. hWnd Specifies a window that will be the owner window of any MessageBox:es or similar. hInst Ignored. lpszCmdLine An ANSI string specifying the disk to save. This can be on the form "F:" or "F:\" (without the quotes). nCmdShow Ignored. */ IMDISK_API void WINAPI RunDLL_SaveImageFile(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow); /** This function displays a MessageBox dialog with a FormatMessage-formatted message. hWndParent Parent window for the MessageBox call. uStyle Style for the MessageBox call. lpTitle Window title for the MessageBox call. lpMessage Format string to be used in call to FormatMessage followed by field parameters. */ IMDISK_API BOOL CDECL ImDiskMsgBoxPrintF(IN HWND hWndParent OPTIONAL, IN UINT uStyle, IN LPCWSTR lpTitle, IN LPCWSTR lpMessage, ...); /** Synchronously flush Windows message queue to make GUI components responsive. */ IMDISK_API VOID WINAPI ImDiskFlushWindowMessages(HWND hWnd); /** Used to get a string describing a partition type. PartitionType Partition type from partition table. Name Pointer to memory that receives a string describing the partition type. NameSize Size of memory area pointed to by the Name parameter. */ IMDISK_API VOID WINAPI ImDiskGetPartitionTypeName(IN BYTE PartitionType, IN OUT LPWSTR Name, IN DWORD NameSize); /** Returns the offset in bytes to actual disk image data for some known "non-raw" image file formats with headers. Returns TRUE if file extension is recognized and the known offset has been stored in the variable pointed to by the Offset parameter. Otherwise the function returns FALSE and the value pointed to by the Offset parameter is not changed. ImageFile Name of raw disk image file. This does not need to be a valid path or filename, just the extension is used by this function. Offset Returned offset in bytes if function returns TRUE. */ IMDISK_API BOOL WINAPI ImDiskGetOffsetByFileExt(IN LPCWSTR ImageFile, IN OUT PLARGE_INTEGER Offset); /** Prototype for raw disk reader function used with ImDisk***Indirect functions. Handle Value that was passed as first parameter to ImDiskGetPartitionInfoIndirect. Buffer Buffer where read data is to be stored. Offset Disk offset where read operation starts. NumberOfBytesToRead Number of bytes to read from disk. NumberOfBytesRead Pointer to DWORD size variable where function stores number of bytes actually read into Buffer. This value can be equal to or less than NumberOfBytesToRead parameter. */ typedef BOOL(WINAPI *ImDiskReadFileProc)(IN HANDLE Handle, IN OUT LPVOID Buffer, IN LARGE_INTEGER Offset, IN DWORD NumberOfBytesToRead, IN OUT LPDWORD NumberOfBytesRead); /** Prototype for caller supplied function that receives a PARTITION_INFORMATION structure called one time for each partition that ImDiskGetPartitionInfoIndirectEx finds. The function should return TRUE to indicate that search for further partition entries should be done, or FALSE to stop the search. The ImDisk***Get*** function will then return FALSE to the caller with GetLastError value set to ERROR_CANCELLED. UserData Value that was passed as last parameter to ImDiskGetPartitionInfoIndirectEx. PartitionInformation Pointer to PARTITION_INFORMATION structure. */ typedef BOOL(WINAPI *ImDiskGetPartitionInfoProc)(LPVOID UserData, PPARTITION_INFORMATION PartitionInformation); /** Attempts to find partition information from a partition table for a raw disk image file. If no master boot record is found this function returns FALSE. Returns TRUE if a master boot record with a partition table is found and values stored in the structures pointed to by the PartitionInformation parameter. Otherwise the function returns FALSE. ImageFile Name of raw disk image file to examine. SectorSize Optional sector size used on disk if different from default 512 bytes. Offset Optional offset in bytes to master boot record within file for use with "non-raw" image files with headers before the actual disk image data. PartitionInformation Pointer to an array of eight PARTITION_INFORMATION structures which will receive information from four recognized primary partition entries followed by four recognized extended entries. */ IMDISK_API BOOL WINAPI ImDiskGetPartitionInformation(IN LPCWSTR ImageFile, IN DWORD SectorSize OPTIONAL, IN PLARGE_INTEGER Offset OPTIONAL, IN OUT PPARTITION_INFORMATION PartitionInformation); /** Attempts to find partition information from a partition table for a raw disk image file. If no master boot record is found this function returns FALSE. Returns TRUE if a master boot record with a partition table is found and a value stored in the structure pointed to by the PartitionInformation parameter. Otherwise the function returns FALSE. ImageFile Name of raw disk image file to examine. SectorSize Optional sector size used on disk if different from default 512 bytes. Offset Optional offset in bytes to master boot record within file for use with "non-raw" image files with headers before the actual disk image data. PartitionInformation Pointer to a PARTITION_INFORMATION structure that will receive information from a recognized partition entry. PartitionNumber Number of partition to receive information for. If there was no partition found with this number, the function returns FALSE and GetLastError will return ERROR_NOT_FOUND. */ IMDISK_API BOOL WINAPI ImDiskGetSinglePartitionInformation(IN LPCWSTR ImageFile, IN DWORD SectorSize OPTIONAL, IN PLARGE_INTEGER Offset OPTIONAL, IN OUT PPARTITION_INFORMATION PartitionInformation, IN INT PartitionNumber); /** Attempts to find partition information from a partition table for a raw disk image file. If no master boot record is found this function returns FALSE. Returns TRUE if a master boot record with a partition table is found and values where returned to callback function. If the callback function cancels search by returning FALSE, this function returns FALSE with GetLastError value set to ERROR_CANCELLED. ImageFile Name of raw disk image file to examine. SectorSize Optional sector size used on disk if different from default 512 bytes. Offset Optional offset in bytes to master boot record within file for use with "non-raw" image files with headers before the actual disk image data. CallBack Caller supplied function that is called with a PARTITION_INFORMATION structure for each recognized partition entry. UserData Optional data to send as first parameter to callback function. */ IMDISK_API BOOL WINAPI ImDiskGetPartitionInformationEx(IN LPCWSTR ImageFile, IN DWORD SectorSize OPTIONAL, IN PLARGE_INTEGER Offset OPTIONAL, IN ImDiskGetPartitionInfoProc GetPartitionInfoProc, IN LPVOID UserData OPTIONAL); /** A device read function with ImDiskReadFileProc, which means that it can be used when calling ImDiskGetPartitionInfoIndirect function. Handle Operating system file handle representing a file or device opened for reading. Buffer Buffer where read data is to be stored. Offset Disk offset where read operation starts. NumberOfBytesToRead Number of bytes to read from disk. NumberOfBytesRead Pointer to DWORD size variable where function stores number of bytes actually read into Buffer. This value can be equal to or less than NumberOfBytesToRead parameter. */ IMDISK_API BOOL WINAPI ImDiskReadFileHandle(IN HANDLE Handle, IN OUT LPVOID Buffer, IN LARGE_INTEGER Offset, IN DWORD NumberOfBytesToRead, IN OUT LPDWORD NumberOfBytesRead); /** Attempts to find partition information from a partition table for a disk image through a supplied device reader function. If no master boot record is found this function returns FALSE. Returns TRUE if a master boot record with a partition table is found and values where returned to callback function. If the callback function cancels search by returning FALSE, this function returns FALSE with GetLastError value set to ERROR_CANCELLED. Handle Value that is passed as first parameter to ReadFileProc. ReadFileProc Procedure of type ImDiskReadFileProc that is called to read raw disk image. SectorSize Optional sector size used on disk if different from default 512 bytes. Offset Optional offset in bytes to master boot record within file for use with "non-raw" image files with headers before the actual disk image data. CallBack Caller supplied function that is called with a PARTITION_INFORMATION structure for each recognized partition entry. UserData Optional data to send as first parameter to callback function. */ IMDISK_API BOOL WINAPI ImDiskGetPartitionInfoIndirectEx(IN HANDLE Handle, IN ImDiskReadFileProc ReadFileProc, IN DWORD SectorSize OPTIONAL, IN PLARGE_INTEGER Offset OPTIONAL, IN ImDiskGetPartitionInfoProc GetPartitionInfoProc, IN LPVOID UserData OPTIONAL); /** Attempts to find partition information from a partition table for a disk image through a supplied device reader function. If no master boot record is found this function returns FALSE. Returns TRUE if a master boot record with a partition table is found and values stored in the structures pointed to by the PartitionInformation parameter. Otherwise the function returns FALSE. Handle Value that is passed as first parameter to ReadFileProc. ReadFileProc Procedure of type ImDiskReadFileProc that is called to read raw disk image. SectorSize Optional sector size used on disk if different from default 512 bytes. Offset Optional offset in bytes to master boot record within file for use with "non-raw" image files with headers before the actual disk image data. PartitionInformation Pointer to an array of eight PARTITION_INFORMATION structures which will receive information from four recognized primary partition entries followed by four recognized extended entries. */ IMDISK_API BOOL WINAPI ImDiskGetPartitionInfoIndirect(IN HANDLE Handle, IN ImDiskReadFileProc ReadFileProc, IN DWORD SectorSize OPTIONAL, IN PLARGE_INTEGER Offset OPTIONAL, IN OUT PPARTITION_INFORMATION PartitionInfo); /** Attempts to find partition information from a partition table for a disk image through a supplied device reader function. If no master boot record is found this function returns FALSE. Returns TRUE if a master boot record with a partition table is found and a value stored in the structure pointed to by the PartitionInformation parameter. Otherwise the function returns FALSE. ImageFile Name of raw disk image file to examine. SectorSize Optional sector size used on disk if different from default 512 bytes. Offset Optional offset in bytes to master boot record within file for use with "non-raw" image files with headers before the actual disk image data. PartitionInformation Pointer to a PARTITION_INFORMATION structure that will receive information from a recognized partition entry. PartitionNumber Number of partition to receive information for. If there was no partition found with this number, the function returns FALSE and GetLastError will return ERROR_NOT_FOUND. */ IMDISK_API BOOL WINAPI ImDiskGetSinglePartitionInfoIndirect(IN HANDLE Handle, IN ImDiskReadFileProc ReadFileProc, IN DWORD SectorSize OPTIONAL, IN PLARGE_INTEGER Offset OPTIONAL, IN OUT PPARTITION_INFORMATION PartitionInformation, IN INT PartitionNumber); /** Finds out if image file contains an ISO9660 filesystem. ImageFile Name of disk image file to examine. Offset Optional offset in bytes to where raw disk data begins, for use with "non-raw" image files with headers before the actual disk image data. */ IMDISK_API BOOL WINAPI ImDiskImageContainsISOFS(IN LPCWSTR ImageFile, IN PLARGE_INTEGER Offset OPTIONAL); /** Finds out if image file contains an ISO9660 filesystem, through a supplied device reader function. Handle Value that is passed as first parameter to ReadFileProc. ReadFileProc Procedure of type ImDiskReadFileProc that is called to read raw disk image. Offset Optional offset in bytes to where raw disk data begins, for use with "non-raw" image files with headers before the actual disk image data. */ IMDISK_API BOOL WINAPI ImDiskImageContainsISOFSIndirect(IN HANDLE Handle, IN ImDiskReadFileProc ReadFileProc, IN PLARGE_INTEGER Offset OPTIONAL); /** Starts a Win32 service or loads a kernel module or driver. ServiceName Key name of the service or driver. */ IMDISK_API BOOL WINAPI ImDiskStartService(IN LPWSTR ServiceName); /** An easy way to turn an empty NTFS directory to a reparse point that redirects requests to a mounted device. Acts quite like mount points or symbolic links in *nix. If MountPoint specifies a character followed by a colon, a drive letter is instead created to point to Target. MountPoint Path to empty directory on an NTFS volume, or a drive letter followed by a colon. Target Target device path on kernel object namespace form, e.g. \Device\ImDisk2 or similar. */ IMDISK_API BOOL WINAPI ImDiskCreateMountPoint(IN LPCWSTR MountPoint, IN LPCWSTR Target); /** Restores a reparse point to be an ordinary empty directory, or removes a drive letter mount point. When removing a drive letter mount point, this function notifies shell components that drive letter is gone unless API flags are set to turn off shell notifications. MountPoint Path to a reparse point on an NTFS volume, or a drive letter followed by a colon to remove a drive letter mount point. */ IMDISK_API BOOL WINAPI ImDiskRemoveMountPoint(IN LPCWSTR MountPoint); /** Opens a device object in the kernel object namespace. FileName Full kernel object namespace path to the object to open, e.g. \Device\ImDisk2 or similar. AccessMode Access mode to request. */ IMDISK_API HANDLE WINAPI ImDiskOpenDeviceByName(IN PUNICODE_STRING FileName, IN DWORD AccessMode); /** Opens an ImDisk device by the device number. DeviceNumber Number of the ImDisk device to open. AccessMode Access mode to request. */ IMDISK_API HANDLE WINAPI ImDiskOpenDeviceByNumber(IN DWORD DeviceNumber, IN DWORD AccessMode); /** Opens the device a junction/mount-point type reparse point is pointing to. MountPoint Path to the reparse point on an NTFS volume. AccessMode Access mode to request to the target device. */ IMDISK_API HANDLE WINAPI ImDiskOpenDeviceByMountPoint(IN LPCWSTR MountPoint, IN DWORD AccessMode); /** Check that the user-mode library and kernel-mode driver version matches for an open ImDisk created device object. DeviceHandle Handle to an open ImDisk virtual disk or control device. */ IMDISK_API BOOL WINAPI ImDiskCheckDriverVersion(IN HANDLE DeviceHandle); /** Retrieves the version numbers of the user-mode API library and the kernel- mode driver. */ IMDISK_API BOOL WINAPI ImDiskGetVersion(IN OUT PULONG LibraryVersion OPTIONAL, IN OUT PULONG DriverVersion OPTIONAL); /** Returns the first free drive letter in the range D-Z. */ IMDISK_API WCHAR WINAPI ImDiskFindFreeDriveLetter(); /** Returns a bit-field representing ImDisk devices. Bit 0 represents device 0, bit 1 represents device 1 and so on. A bit is 1 if the device exists or 0 if the device number is free. Compatibility notice: This function is exported for compatibility with ImDisk versions before 1.7.0. Since that version, drives can have device numbers above 63. This function cannot return such device numbers, so in case any drive with device number above 63 exist when this function is called, it returns a value filled with all ones ((ULONGLONG)-1). Use ImDiskGetDeviceListEx function with newer versions of ImDisk. */ IMDISK_API ULONGLONG WINAPI ImDiskGetDeviceList(); /** Builds a list of currently existing ImDisk virtual disks. ListLength Set this parameter to number of ULONG element that can be store at the location pointed to by DeviceList parameter. This parameter must be at least 3 for this function to work correctly. DeviceList Pointer to memory location where one ULONG, containing a device number, will be stored for each currently existing ImDisk device. First element in list is used to store number of devices. Upon return, first element in DeviceList will contain number of currently existing ImDisk virtual disks. If DeviceList is too small to contain all items as indicated by ListLength parameter, number of existing devices will be stored at DeviceList location, but no further items will be stored. If an error occurs, this function returns FALSE and GetLastError will return an error code. If successful, the function returns TRUE and first element at location pointed to by DeviceList will contain number of devices currently on the system, i.e. number of elements following the first one in DeviceList. If DeviceList buffer is too small, the function returns FALSE and GetLastError returns ERROR_MORE_DATA. In that case, only number of existing devices will be stored at location pointed to by DeviceList parameter. That value, plus one for the first length element, indicates how large the buffer needs to be to successfully store all items. */ IMDISK_API BOOL WINAPI ImDiskGetDeviceListEx(IN ULONG ListLength, OUT PULONG DeviceList); /** This function sends an IOCTL_IMDISK_QUERY_DEVICE control code to an existing device and returns information about the device in an IMDISK_CREATE_DATA structure. DeviceNumber Number of the ImDisk device to query. CreateData Pointer to a sufficiently large IMDISK_CREATE_DATA structure to receive all data including the image file name where applicable. CreateDataSize The size in bytes of the memory the CreateData parameter points to. The function call will fail if the memory is not large enough to hold the entire IMDISK_CREATE_DATA structure. */ IMDISK_API BOOL WINAPI ImDiskQueryDevice(IN DWORD DeviceNumber, IN OUT PIMDISK_CREATE_DATA CreateData, IN ULONG CreateDataSize); /** This function creates a new ImDisk virtual disk device. hWndStatusText A handle to a window that can display status message text. The function will send WM_SETTEXT messages to this window. If this parameter is NULL no WM_SETTEXT messages are sent and the function acts non-interactive. DiskGeometry The virtual geometry of the new virtual disk. Note that the Cylinders member does not specify the number of Cylinders but the total size in bytes of the new virtual disk. The actual number of cylinders are then automatically calculated and rounded down if necessary. The Cylinders member can be zero if the device is backed by an image file or a proxy device, but not if it is virtual memory only device. All or some of the other members of this structure can be zero in which case they are automatically filled in with most reasonable values by the driver. Flags Bitwise or-ed combination of one of the IMDISK_TYPE_xxx flags, one of the IMDISK_DEVICE_TYPE_xxx flags and any number of IMDISK_OPTION_xxx flags. The flags can often be left zero and left to the driver to automatically select. For example, if a virtual disk size is specified to 1440 KB and an image file name is not specified, the driver automatically selects IMDISK_TYPE_VM|IMDISK_DEVICE_TYPE_FD for this parameter. FileName Name of disk image file. In case IMDISK_TYPE_VM is specified in the Flags parameter, this file will be loaded into the virtual memory-backed disk when created. NativePath Set to TRUE if the FileName parameter specifies an NT native path, such as \??\C:\imagefile.img or FALSE if it specifies a Win32/DOS-style path such as C:\imagefile.img. MountPoint Drive letter to assign to the new virtual device. It can be specified on the form F: or F:\. It can also specify an empty directory on another NTFS volume. */ IMDISK_API BOOL WINAPI ImDiskCreateDevice(IN HWND hWndStatusText OPTIONAL, IN OUT PDISK_GEOMETRY DiskGeometry OPTIONAL, IN PLARGE_INTEGER ImageOffset OPTIONAL, IN DWORD Flags OPTIONAL, IN LPCWSTR FileName OPTIONAL, IN BOOL NativePath, IN LPWSTR MountPoint OPTIONAL); /** This function creates a new ImDisk virtual disk device. hWndStatusText A handle to a window that can display status message text. The function will send WM_SETTEXT messages to this window. If this parameter is NULL no WM_SETTEXT messages are sent and the function acts non-interactive. DeviceNumber In: Device number for device to create. Device number must not be in use by an existing virtual disk. For automatic allocation of device number, use IMDISK_AUTO_DEVICE_NUMBER constant or specify a NULL pointer. Out: If DeviceNumber parameter is not NULL, device number for created device is returned in DWORD variable pointed to. DiskGeometry The virtual geometry of the new virtual disk. Note that the Cylinders member does not specify the number of Cylinders but the total size in bytes of the new virtual disk. The actual number of cylinders are then automatically calculated and rounded down if necessary. The Cylinders member can be zero if the device is backed by an image file or a proxy device, but not if it is virtual memory only device. All or some of the other members of this structure can be zero in which case they are automatically filled in with most reasonable values by the driver. Flags Bitwise or-ed combination of one of the IMDISK_TYPE_xxx flags, one of the IMDISK_DEVICE_TYPE_xxx flags and any number of IMDISK_OPTION_xxx flags. The flags can often be left zero and left to the driver to automatically select. For example, if a virtual disk size is specified to 1440 KB and an image file name is not specified, the driver automatically selects IMDISK_TYPE_VM|IMDISK_DEVICE_TYPE_FD for this parameter. FileName Name of disk image file. In case IMDISK_TYPE_VM is specified in the Flags parameter, this file will be loaded into the virtual memory-backed disk when created. NativePath Set to TRUE if the FileName parameter specifies an NT native path, such as \??\C:\imagefile.img or FALSE if it specifies a Win32/DOS-style path such as C:\imagefile.img. MountPoint Drive letter to assign to the new virtual device. It can be specified on the form F: or F:\. It can also specify an empty directory on another NTFS volume. */ IMDISK_API BOOL WINAPI ImDiskCreateDeviceEx(IN HWND hWndStatusText OPTIONAL, IN OUT LPDWORD DeviceNumber OPTIONAL, IN OUT PDISK_GEOMETRY DiskGeometry OPTIONAL, IN PLARGE_INTEGER ImageOffset OPTIONAL, IN DWORD Flags OPTIONAL, IN LPCWSTR FileName OPTIONAL, IN BOOL NativePath, IN LPWSTR MountPoint OPTIONAL); /** This function removes (unmounts) an existing ImDisk virtual disk device. hWndStatusText A handle to a window that can display status message text. The function will send WM_SETTEXT messages to this window. If this parameter is NULL no WM_SETTEXT messages are sent and the function acts non-interactive. DeviceNumber Number of the ImDisk device to remove. This parameter is only used if MountPoint parameter is null. MountPoint Drive letter of the device to remove. It can be specified on the form F: or F:\. */ IMDISK_API BOOL WINAPI ImDiskRemoveDevice(IN HWND hWndStatusText OPTIONAL, IN DWORD DeviceNumber OPTIONAL, IN LPCWSTR MountPoint OPTIONAL); /** This function forcefully removes (unmounts) an existing ImDisk virtual disk device. Any unsaved data will be lost. Device Handle to open device. If not NULL, it is used to query device number to find out which device to remove. If this parameter is NULL the DeviceNumber parameter is used instead. DeviceNumber Number of the ImDisk device to remove. This parameter is only used if Device parameter is NULL. */ IMDISK_API BOOL WINAPI ImDiskForceRemoveDevice(IN HANDLE Device OPTIONAL, IN DWORD DeviceNumber OPTIONAL); /** This function changes the device characteristics of an existing ImDisk virtual disk device. hWndStatusText A handle to a window that can display status message text. The function will send WM_SETTEXT messages to this window. If this parameter is NULL no WM_SETTEXT messages are sent and the function acts non-interactive. DeviceNumber Number of the ImDisk device to change. This parameter is only used if MountPoint parameter is null. MountPoint Drive letter of the device to change. It can be specified on the form F: or F:\. FlagsToChange A bit-field specifying which flags to edit. The flags are the same as the option flags in the Flags parameter used when a new virtual disk is created. Only flags set in this parameter are changed to the corresponding flag value in the Flags parameter. Flags New values for the flags specified by the FlagsToChange parameter. */ IMDISK_API BOOL WINAPI ImDiskChangeFlags(HWND hWndStatusText OPTIONAL, DWORD DeviceNumber OPTIONAL, LPCWSTR MountPoint OPTIONAL, DWORD FlagsToChange, DWORD Flags); /** This function extends the size of an existing ImDisk virtual disk device. hWndStatusText A handle to a window that can display status message text. The function will send WM_SETTEXT messages to this window. If this parameter is NULL no WM_SETTEXT messages are sent and the function acts non-interactive. DeviceNumber Number of the ImDisk device to extend. ExtendSize A pointer to a LARGE_INTEGER structure that specifies the number of bytes to extend the device. */ IMDISK_API BOOL WINAPI ImDiskExtendDevice(IN HWND hWndStatusText OPTIONAL, IN DWORD DeviceNumber, IN CONST PLARGE_INTEGER ExtendSize); /** This function saves the contents of a device to an image file. DeviceHandle Handle to a device for which the contents are to be saved to an image file. The handle must be opened for reading, may be opened for sequential scan and/or without intermediate buffering but cannot be opened for overlapped operation. Please note that a call to this function will turn on FSCTL_ALLOW_EXTENDED_DASD_IO on for this handle. FileHandle Handle to an image file opened for writing. The handle can be opened for operation without intermediate buffering but performance is usually better if the handle is opened with intermediate buffering. The handle cannot be opened for overlapped operation. BufferSize I/O buffer size to use when reading source disk. This parameter is optional, if it is zero the buffer size to use will automatically chosen. CancelFlag Optional pointer to a BOOL value. If this BOOL value is set to TRUE during the function call the operation is cancelled, the function returns FALSE and GetLastError will return ERROR_CANCELLED. If this parameter is non-null the function will also dispatch window messages for the current thread between each I/O operation. */ IMDISK_API BOOL WINAPI ImDiskSaveImageFile(IN HANDLE DeviceHandle, IN HANDLE FileHandle, IN DWORD BufferSize OPTIONAL, IN LPBOOL CancelFlag OPTIONAL); /** This function gets the size of a disk volume. Handle Handle to a disk volume device. Size Pointer to a 64 bit variable that upon successful completion receives disk volume size as a signed integer. */ IMDISK_API BOOL WINAPI ImDiskGetVolumeSize(IN HANDLE Handle, IN OUT PLONGLONG Size); /** Reads formatted geometry for a volume by parsing BPB, BIOS Parameter Block, from volume boot record into a DISK_GEOMETRY structure. If no boot record signature is found, this function returns FALSE. ImageFile Path to a volume image file or a device path to a disk volume, such as \\.\A: or \\.\C:. Offset Optional offset in bytes to volume boot record within file for use with "non-raw" volume image files. This parameter can be used to for example skip over headers for specific disk image formats, or to skip over master boot record in a disk image file that contains a complete raw disk image and not only a single volume. DiskGeometry Pointer to DISK_GEOMETRY structure that receives information about formatted geometry. This function zeros the Cylinders member. */ IMDISK_API BOOL WINAPI ImDiskGetFormattedGeometry(IN LPCWSTR ImageFile, IN PLARGE_INTEGER Offset OPTIONAL, IN OUT PDISK_GEOMETRY DiskGeometry); /** Reads formatted geometry for a volume by parsing BPB, BIOS Parameter Block, from volume boot record into a DISK_GEOMETRY structure. If no boot record signature is found, this function returns FALSE. Handle Value that is passed as first parameter to ReadFileProc. ReadFileProc Procedure of type ImDiskReadFileProc that is called to read disk volume. Offset Optional offset in bytes to volume boot record within file for use with "non-raw" volume image files. This parameter can be used to for example skip over headers for specific disk image formats, or to skip over master boot record in a disk image file that contains a complete raw disk image and not only a single volume. DiskGeometry Pointer to DISK_GEOMETRY structure that receives information about formatted geometry. This function zeros the Cylinders member. */ IMDISK_API BOOL WINAPI ImDiskGetFormattedGeometryIndirect(IN HANDLE Handle, IN ImDiskReadFileProc ReadFileProc, IN PLARGE_INTEGER Offset OPTIONAL, IN OUT PDISK_GEOMETRY DiskGeometry); /** This function builds a Master Boot Record, MBR, in memory. The MBR will contain a default Initial Program Loader, IPL, which could be used to boot an operating system partition when the MBR is written to a disk. DiskGeometry Pointer to a DISK_GEOMETRY or DISK_GEOMETRY_EX structure that contains information about logical geometry of the disk. This function only uses the BytesPerSector, SectorsPerTrack and TracksPerCylinder members. This parameter can be NULL if NumberOfParts parameter is zero. PartitionInfo Pointer to an array of up to four PARTITION_INFORMATION structures containing information about partitions to store in MBR partition table. This function only uses the StartingOffset, PartitionLength, BootIndicator and PartitionType members. This parameter can be NULL if NumberOfParts parameter is zero. NumberOfParts Number of PARTITION_INFORMATION structures in array that PartitionInfo parameter points to. If this parameter is zero, DiskGeometry and PartitionInfo parameters are ignored and can be NULL. In that case MBR will contain an empty partition table when this function returns. MBR Pointer to memory buffer of at least 512 bytes where MBR will be built. MBRSize Size of buffer pointed to by MBR parameter. This parameter must be at least 512. */ IMDISK_API BOOL WINAPI ImDiskBuildMBR(IN PDISK_GEOMETRY DiskGeometry OPTIONAL, IN PPARTITION_INFORMATION PartitionInfo OPTIONAL, IN BYTE NumberOfParts OPTIONAL, IN OUT LPBYTE MBR, IN DWORD_PTR MBRSize); /** This function converts a CHS disk address to LBA format. DiskGeometry Pointer to a DISK_GEOMETRY or DISK_GEOMETRY_EX structure that contains information about logical geometry of the disk. This function only uses the SectorsPerTrack and TracksPerCylinder members. CHS Pointer to CHS disk address in three-byte partition table style format. */ IMDISK_API DWORD WINAPI ImDiskConvertCHSToLBA(IN PDISK_GEOMETRY DiskGeometry, IN LPBYTE CHS); /** This function converts an LBA disk address to three-byte partition style CHS format. The three bytes are returned in the three lower bytes of a DWORD. DiskGeometry Pointer to a DISK_GEOMETRY or DISK_GEOMETRY_EX structure that contains information about logical geometry of the disk. This function only uses the SectorsPerTrack and TracksPerCylinder members. LBA LBA disk address. */ IMDISK_API DWORD WINAPI ImDiskConvertLBAToCHS(IN PDISK_GEOMETRY DiskGeometry, IN DWORD LBA); /** This function adjusts size of a saved image file. If file size is less than requested disk size, the size will be left unchanged with return value FALSE and GetLastError will return ERROR_DISK_OPERATION_FAILED. FileHandle Handle to file where disk image has been saved. FileSize Size of original disk which image file should be adjusted to. */ IMDISK_API BOOL WINAPI ImDiskAdjustImageFileSize(IN HANDLE FileHandle, IN PLARGE_INTEGER FileSize); /** This function converts a native NT-style path to a Win32 DOS-style path. The path string is converted in-place and the start address is adjusted to skip over native directories such as \??\. Because of this, the Path parameter is a pointer to a pointer to a string so that the pointer can be adjusted to the new start address. Path Pointer to pointer to Path string in native NT-style format. Upon return the pointed address will contain the start address of the Win32 DOS-style path within the original buffer. */ IMDISK_API VOID WINAPI ImDiskNativePathToWin32(IN OUT LPWSTR *Path); /** This function saves the contents of a device to an image file. This is a user-interactive function that displays dialog boxes where user can select image file and other options. DeviceHandle Handle to a device for which the contents are to be saved to an image file. The handle must be opened for reading, may be opened for sequential scan and/or without intermediate buffering but cannot be opened for overlapped operation. Please note that a call to this function will turn on FSCTL_ALLOW_EXTENDED_DASD_IO on for this handle. WindowHandle Handle to existing window that will be parent to dialog boxes etc. BufferSize I/O buffer size to use when reading source disk. This parameter is optional, if it is zero the buffer size to use will automatically chosen. IsCdRomType If this parameter is TRUE and the source device type cannot be automatically determined this function will ask user for a .iso suffixed image file name. */ IMDISK_API VOID WINAPI ImDiskSaveImageFileInteractive(IN HANDLE DeviceHandle, IN HWND WindowHandle OPTIONAL, IN DWORD BufferSize OPTIONAL, IN BOOL IsCdRomType OPTIONAL); /* Opens or creates a global synchronization event. This event is shared with ImDisk driver and will be pulsed when an ImDisk device is created, removed or have settings changed in some other way. This is particularly useful for user interface components that need to be notified when device lists and similar need to be updated. If successful, this function returns a handle to an event that can be used in call to system wait functions, such as WaitForSingleObject. When the handle is not needed, it must be closed by calling CloseHandle. If the function fails, it returns NULL and GetLastError will return a system error code that further explains the error. InheritHandle Specifies whether or not the returned handle will be inherited by child processes. */ IMDISK_API HANDLE WINAPI ImDiskOpenRefreshEvent(BOOL InheritHandle); /* Adds registry settings for creating a virtual disk at system startup (or when driver is loaded). This function returns TRUE if successful, FALSE otherwise. If FALSE is returned, GetLastError could be used to get actual error code. CreateData Pointer to IMDISK_CREATE_DATA structure that contains device creation settings to save. */ IMDISK_API BOOL WINAPI ImDiskSaveRegistrySettings(PIMDISK_CREATE_DATA CreateData); /* Remove registry settings for creating a virtual disk at system startup (or when driver is loaded). This function returns TRUE if successful, FALSE otherwise. If FALSE is returned, GetLastError could be used to get actual error code. DeviceNumber Device number specified in registry settings. */ IMDISK_API BOOL WINAPI ImDiskRemoveRegistrySettings(DWORD DeviceNumber); /* Retrieves number of auto-loading devices at system startup, or when driver is loaded. This is the value of the LoadDevices registry value for imdisk.sys driver. This function returns TRUE if successful, FALSE otherwise. If FALSE is returned, GetLastError could be used to get actual error code. LoadDevicesValue Pointer to variable that receives the value. */ IMDISK_API BOOL WINAPI ImDiskGetRegistryAutoLoadDevices(LPDWORD LoadDevicesValue); /* Notify Explorer and other shell components that a new drive letter has been created. Called automatically by device creation after creating a drive letter. If no drive letter was created by a device creation routine or if API flags was set to turn off shell notification during device creation, this function can be called manually later. Note that calling this function has no effect if API flags are set to turn off shell notifications, or if supplied drive letter path does not specify an A-Z drive letter. This function returns TRUE if successful, FALSE otherwise. If FALSE is returned, GetLastError could be used to get actual error code. hWnd Window handle to use as parent handle for any message boxes. If this parameter is NULL, no message boxes are displayed. DriveLetterPath Drive letter path in one of formats A:\ or A:. */ IMDISK_API BOOL WINAPI ImDiskNotifyShellDriveLetter(HWND hWnd, LPWSTR DriveLetterPath); /* Notify Explorer and other shell components that a drive is about to be removed. hWnd Window handle to use as parent handle for any message boxes. If this parameter is NULL, no message boxes are displayed. DriveLetter Drive letter. */ IMDISK_API BOOL WINAPI ImDiskNotifyRemovePending(HWND hWnd, WCHAR DriveLetter); IMDISK_API LPWSTR CDECL ImDiskAllocPrintF(LPCWSTR lpMessage, ...); IMDISK_API int WINAPI ImDiskConsoleMessageA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); IMDISK_API int WINAPI ImDiskConsoleMessageW( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); #ifdef CORE_BUILD #ifdef CharToOemA #undef CharToOemA #endif #define CharToOemA(s,t) #ifdef MessageBoxA #undef MessageBoxA #endif #ifdef MessageBoxW #undef MessageBoxW #endif #ifdef SetWindowTextA #undef SetWindowTextA #endif #ifdef SetWindowTextW #undef SetWindowTextW #endif #define MessageBoxA ImDiskConsoleMessageA #define MessageBoxW ImDiskConsoleMessageW #define SetWindowTextA(h,t) ImDiskConsoleMessageA(h,t,"",0) #define SetWindowTextW(h,t) ImDiskConsoleMessageW(h,t,L"",0) #endif #ifdef __cplusplus } #endif #endif #endif // _INC_IMDISK_