Sandboxie/SandboxieTools/ImDisk/inc/imdisk.h

1591 lines
56 KiB
C
Raw Normal View History

2023-08-24 19:34:12 +01:00
/*
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_