#ifndef _ENUM_DISK_INCLUDE_ #define _ENUM_DISK_INCLUDE_ #include "ntdll.h" #include #include #include #include #include #include #include "dbt.h" #include "ext2fs.h" #include //#include //#include /****************************************************************** * * * VersionHelpers.h -- This module defines helper functions to * * promote version check with proper * * comparisons. * * * * Copyright (c) Microsoft Corp. All rights reserved. * * * ******************************************************************/ #ifndef _versionhelpers_H_INCLUDED_ #define _versionhelpers_H_INCLUDED_ #ifndef ___XP_BUILD #define WINAPI_PARTITION_DESKTOP (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) #define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP #define WINAPI_FAMILY_PARTITION(Partitions) (Partitions) #define _WIN32_WINNT_NT4 0x0400 #define _WIN32_WINNT_WIN2K 0x0500 #define _WIN32_WINNT_WINXP 0x0501 #define _WIN32_WINNT_WS03 0x0502 #define _WIN32_WINNT_WIN6 0x0600 #define _WIN32_WINNT_VISTA 0x0600 #define _WIN32_WINNT_WS08 0x0600 #define _WIN32_WINNT_LONGHORN 0x0600 #define _WIN32_WINNT_WIN7 0x0601 #define _WIN32_WINNT_WIN8 0x0602 #endif #ifdef _MSC_VER #pragma once #endif // _MSC_VER #ifdef __cplusplus #define VERSIONHELPERAPI inline bool #else // __cplusplus #define VERSIONHELPERAPI FORCEINLINE BOOL #endif // __cplusplus #define _WIN32_WINNT_WINBLUE 0x0603 #define _WIN32_WINNT_WIN10 0x0A00 typedef NT::NTSTATUS( NTAPI* fnRtlGetVersion )(PRTL_OSVERSIONINFOW lpVersionInformation); VERSIONHELPERAPI IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) { /*OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; DWORDLONG const dwlConditionMask = VerSetConditionMask( VerSetConditionMask( VerSetConditionMask( 0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); osvi.dwMajorVersion = wMajorVersion; osvi.dwMinorVersion = wMinorVersion; osvi.wServicePackMajor = wServicePackMajor; return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;*/ RTL_OSVERSIONINFOEXW verInfo = { 0 }; verInfo.dwOSVersionInfoSize = sizeof( verInfo ); static fnRtlGetVersion RtlGetVersion = (fnRtlGetVersion)GetProcAddress( GetModuleHandleW( L"ntdll.dll" ), "RtlGetVersion" ); if (RtlGetVersion != 0 && RtlGetVersion( (PRTL_OSVERSIONINFOW)&verInfo ) == 0) { if (verInfo.dwMajorVersion > wMajorVersion) return true; else if (verInfo.dwMajorVersion < wMajorVersion) return false; if (verInfo.dwMinorVersion > wMinorVersion) return true; else if (verInfo.dwMinorVersion < wMinorVersion) return false; if (verInfo.wServicePackMajor >= wServicePackMajor) return true; } return false; } VERSIONHELPERAPI IsWindowsXPOrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 0 ); } VERSIONHELPERAPI IsWindowsXPSP1OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 1 ); } VERSIONHELPERAPI IsWindowsXPSP2OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 2 ); } VERSIONHELPERAPI IsWindowsXPSP3OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 3 ); } VERSIONHELPERAPI IsWindowsVistaOrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 0 ); } VERSIONHELPERAPI IsWindowsVistaSP1OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 1 ); } VERSIONHELPERAPI IsWindowsVistaSP2OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 2 ); } VERSIONHELPERAPI IsWindows7OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 0 ); } VERSIONHELPERAPI IsWindows7SP1OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 1 ); } VERSIONHELPERAPI IsWindows8OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN8 ), LOBYTE( _WIN32_WINNT_WIN8 ), 0 ); } VERSIONHELPERAPI IsWindows8Point1OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINBLUE ), LOBYTE( _WIN32_WINNT_WINBLUE ), 0 ); } VERSIONHELPERAPI IsWindows10OrGreater() { return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN10 ), LOBYTE( _WIN32_WINNT_WIN10 ), 0 ); } VERSIONHELPERAPI IsWindowsServer() { OSVERSIONINFOEXW osvi = { sizeof( osvi ), 0, 0, 0, 0, { 0 }, 0, 0, 0, VER_NT_WORKSTATION }; DWORDLONG const dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL ); return !VerifyVersionInfoW( &osvi, VER_PRODUCT_TYPE, dwlConditionMask ); } #endif // _VERSIONHELPERS_H_INCLUDED_ /* * system definitions */ #define USING_IOCTL_EX TRUE #if (USING_IOCTL_EX) // // New IOCTLs for GUID Partition tabled disks. // #define IOCTL_DISK_GET_DRIVE_LAYOUT_EXT IOCTL_DISK_GET_DRIVE_LAYOUT_EX #define IOCTL_DISK_SET_DRIVE_LAYOUT_EXT IOCTL_DISK_SET_DRIVE_LAYOUT_EX #define PARTITION_INFORMATION_EXT PARTITION_INFORMATION_EX #define PPARTITION_INFORMATION_EXT PARTITION_INFORMATION_EX * #define DRIVE_LAYOUT_INFORMATION_EXT DRIVE_LAYOUT_INFORMATION_EX #define PDRIVE_LAYOUT_INFORMATION_EXT DRIVE_LAYOUT_INFORMATION_EX * #else #define IOCTL_DISK_GET_DRIVE_LAYOUT_EXT IOCTL_DISK_GET_DRIVE_LAYOUT #define IOCTL_DISK_SET_DRIVE_LAYOUT_EXT IOCTL_DISK_SET_DRIVE_LAYOUT typedef PARTITION_INFORMATION PARTITION_INFORMATION_EXT, *PPARTITION_INFORMATION_EXT; typedef DRIVE_LAYOUT_INFORMATION DRIVE_LAYOUT_INFORMATION_EXT, *PDRIVE_LAYOUT_INFORMATION_EXT; #endif // USING_IOCTL_EX // // Bus Type // static char* BusType[] = { "UNKNOWN", // 0x00 "SCSI", "ATAPI", "ATA", "IEEE 1394", "SSA", "FIBRE", "USB", "RAID" }; // // SCSI Device Type // static char* DeviceType[] = { "Direct Access Device", // 0x00 "Tape Device", // 0x01 "Printer Device", // 0x02 "Processor Device", // 0x03 "WORM Device", // 0x04 "CDROM Device", // 0x05 "Scanner Device", // 0x06 "Optical Disk", // 0x07 "Media Changer", // 0x08 "Comm. Device", // 0x09 "ASCIT8", // 0x0A "ASCIT8", // 0x0B "Array Device", // 0x0C "Enclosure Device", // 0x0D "RBC Device", // 0x0E "Unknown Device" // 0x0F }; /* * IFS format callbacks */ // // Output command // typedef struct { DWORD Lines; PCHAR Output; } TEXTOUTPUT, *PTEXTOUTPUT; // // Callback command types // typedef enum { PROGRESS, DONEWITHSTRUCTURE, UNKNOWN2, UNKNOWN3, UNKNOWN4, UNKNOWN5, INSUFFICIENTRIGHTS, UNKNOWN7, UNKNOWN8, UNKNOWN9, UNKNOWNA, DONE, UNKNOWNC, UNKNOWND, OUTPUT, STRUCTUREPROGRESS } CALLBACKCOMMAND; /* * ext2 codepages */ extern CHAR * gCodepages[]; // // FMIFS callback definition // typedef BOOL (__stdcall *PFMIFSCALLBACK)( CALLBACKCOMMAND Command, DWORD SubAction, PVOID ActionInfo ); // // Chkdsk command in FMIFS // typedef VOID (__stdcall *PCHKDSK)( PWCHAR DriveRoot, PWCHAR Format, BOOL CorrectErrors, BOOL Verbose, BOOL CheckOnlyIfDirty, BOOL ScanDrive, PVOID Unused2, PVOID Unused3, PFMIFSCALLBACK Callback ); // // Format command in FMIFS // // media flags #define FMIFS_HARDDISK 0xC #define FMIFS_FLOPPY 0x8 typedef VOID (__stdcall *PFORMATEX)( PWCHAR DriveRoot, DWORD MediaFlag, PWCHAR Format, PWCHAR Label, BOOL QuickFormat, DWORD ClusterSize, PFMIFSCALLBACK Callback ); #include "..\ext4fsd\include\common.h" /* * structure definitions */ typedef struct _EXT2_PARTITION *PEXT2_PARTITION; typedef struct _EXT2_DISK { ULONG Magic; ULONG Null; CHAR Name[256]; ULONGLONG Size; BOOL bEjected; BOOL bLoaded; BOOL IsFile; UCHAR OrderNo; UCHAR NumParts; UCHAR ExtStart; DISK_GEOMETRY DiskGeometry; STORAGE_DEVICE_DESCRIPTOR SDD; STORAGE_ADAPTER_DESCRIPTOR SAD; PDRIVE_LAYOUT_INFORMATION_EXT Layout; PEXT2_PARTITION DataParts; } EXT2_DISK, *PEXT2_DISK; #define EXT2_DISK_MAGIC 'EDSK' #define EXT2_DISK_NULL_MAGIC 'ENUL' typedef struct _EXT2_CDROM { ULONG Magic[2]; CHAR Name[256]; ULONGLONG Size; UCHAR OrderNo; BOOL bLoaded; BOOL bEjected; BOOL bIsDVD; ULONGLONG DrvLetters; DISK_GEOMETRY DiskGeometry; STORAGE_DEVICE_DESCRIPTOR SDD; STORAGE_ADAPTER_DESCRIPTOR SAD; EXT2_VOLUME_PROPERTY3 EVP; } EXT2_CDROM, *PEXT2_CDROM; #define EXT2_CDROM_DEVICE_MAGIC 'ECDR' #define EXT2_CDROM_VOLUME_MAGIC 'ECDV' typedef struct _EXT2_VOLUME { ULONG Magic; struct _EXT2_VOLUME * Next; CHAR Name[REGSTR_VAL_MAX_HCID_LEN]; ULONGLONG DrvLetters; BOOL bRecognized; BOOL bDynamic; PVOLUME_DISK_EXTENTS Extent; NT::FILE_FS_DEVICE_INFORMATION FsdInfo; NT::FILE_FS_SIZE_INFORMATION FssInfo; union { NT::FILE_FS_ATTRIBUTE_INFORMATION FsaInfo; CHAR _tmp_alinged_buf[MAX_PATH]; }; CHAR FileSystem[64]; EXT2_VOLUME_PROPERTY3 EVP; PEXT2_PARTITION Part; } EXT2_VOLUME, *PEXT2_VOLUME; #define EXT2_VOLUME_MAGIC 'EVOL' typedef struct _EXT2_PARTITION { ULONG Magic; DWORD PartType; PEXT2_DISK Disk; PPARTITION_INFORMATION_EXT Entry; ULONGLONG DrvLetters; PEXT2_VOLUME Volume; UCHAR Number; CHAR Name[REGSTR_VAL_MAX_HCID_LEN]; } EXT2_PARTITION; #define EXT2_PART_MAGIC 'EPRT' typedef struct _EXT2_LETTER { UCHAR Letter; BOOL bInvalid; BOOL bUsed; BOOL bTemporary; UINT DrvType; PVOLUME_DISK_EXTENTS Extent; PSTORAGE_DEVICE_NUMBER SDN; CHAR SymLink[MAX_PATH]; } EXT2_LETTER, *PEXT2_LETTER; /* * global definitions */ extern BOOL g_bAutoMount; extern ULONG g_nFlps; extern ULONG g_nDisks; extern ULONG g_nCdroms; extern ULONG g_nVols; extern EXT2_LETTER drvLetters[26]; extern EXT2_LETTER drvDigits[10]; extern PEXT2_DISK gDisks; extern PEXT2_CDROM gCdroms; extern PEXT2_VOLUME gVols; /* * routines definitions */ char *PartitionString(int type); char *DriveTypeString(UINT type); char *DeviceTypeString(DEVICE_TYPE type); char *BusTypeString(STORAGE_BUS_TYPE BusType); BOOL IsWindows2000(); BOOL IsVistaOrAbove(); BOOL CanDoLocalMount(); #define EXT2_DESIRED_ACCESS (GENERIC_READ) NT::NTSTATUS Ext2Open( PCHAR FileName, PHANDLE Handle, ULONG DesiredAccess ); VOID Ext2Close(HANDLE* Handle); NT::NTSTATUS Ext2WriteDisk( HANDLE Handle, BOOL IsFile, ULONG SectorSize, ULONGLONG Offset, ULONG Length, PVOID Buffer ); NT::NTSTATUS Ext2Read( IN HANDLE Handle, IN BOOL IsFile, IN ULONG SectorSize, IN ULONGLONG Offset, IN ULONG Length, IN PVOID Buffer ); NT::NTSTATUS Ext2QueryDisk( HANDLE Handle, PDISK_GEOMETRY DiskGeometry ); PVOLUME_DISK_EXTENTS Ext2QueryVolumeExtents( HANDLE hVolume ); PVOLUME_DISK_EXTENTS Ext2QueryDriveExtents( CHAR DriveLetter ); BOOL Ext2QueryDrvLetter( PEXT2_LETTER drvLetter ); NT::NTSTATUS Ext2QueryMediaType( HANDLE Handle, PDWORD MediaType ); NT::NTSTATUS Ext2QueryProperty( HANDLE Handle, STORAGE_PROPERTY_ID Id, PVOID DescBuf, ULONG DescSize ); PDRIVE_LAYOUT_INFORMATION_EXT Ext2QueryDriveLayout( HANDLE Handle, PUCHAR NumOfParts ); NT::NTSTATUS Ext2SetDriveLayout( HANDLE Handle, PDRIVE_LAYOUT_INFORMATION_EXT Layout ); BOOL Ext2SetPartitionType( PEXT2_PARTITION Part, BYTE Type ); PEXT2_PARTITION Ext2QueryVolumePartition( PEXT2_VOLUME Volume ); BOOL Ext2FlushVolume(CHAR *Device); BOOL Ext2QuerySysConfig(); BOOL Ext2CompareExtents( PVOLUME_DISK_EXTENTS ext1, PVOLUME_DISK_EXTENTS ext2 ); ULONGLONG Ext2QueryVolumeDrvLetters(PEXT2_VOLUME Volume); VOID Ext2QueryVolumeDisks(PEXT2_VOLUME Volume); ULONGLONG Ext2QueryCdromDrvLetters(PEXT2_CDROM Cdrom); VOID Ext2DrvNotify(UCHAR drive, int mount); BOOL Ext2QueryExt2Property ( HANDLE Handle, PEXT2_VOLUME_PROPERTY3 EVP ); BOOL Ext2QueryPerfStat ( HANDLE Handle, PEXT2_QUERY_PERFSTAT Stat, PEXT2_PERF_STATISTICS_V1 *PerfV1, PEXT2_PERF_STATISTICS_V2 *PerfV2 ); BOOL Ext2IsNullUuid (__u8 * uuid); BOOL Ext2CheckVolumeRegistryProperty( PEXT2_VOLUME_PROPERTY3 EVP ); VOID Ext2SetDefaultVolumeRegistryProperty( PEXT2_VOLUME_PROPERTY3 EVP ); VOID Ext2StorePropertyinRegistry( PEXT2_VOLUME_PROPERTY3 EVP ); BOOL Ext2SetExt2Property ( HANDLE Handle, PEXT2_VOLUME_PROPERTY3 EVP ); BOOL Ext2QueryGlobalProperty( ULONG * ulStartup, BOOL * bReadonly, BOOL * bExt3Writable, CHAR * Codepage, CHAR * sPrefix, CHAR * sSuffix, BOOL * bAutoMount ); INT Ext2QueryDrvVersion( CHAR * Version, CHAR * Date, CHAR * Time ); BOOL Ext2SetGlobalProperty ( ULONG ulStartup, BOOLEAN bReadonly, BOOLEAN bExt3Writable, CHAR * Codepage, CHAR * sPrefix, CHAR * sSuffix, BOOL bAutoMount ); BOOL Ext2IsX64System(); BOOL Ext2IsServiceStarted(); BOOL Ext2StartService(CHAR *service); BOOL Ext2StartExt2Srv(); BOOL Ext2StartExt2Fsd(); CString Ext2SysInformation(); BOOL Ext2LoadDisks(); BOOL Ext2ProcessExt2Volumes(); VOID Ext2CleanupDisks(); BOOL Ext2LoadCdroms(); VOID Ext2LoadCdromDrvLetters(); VOID Ext2CleanupCdroms(); BOOL Ext2LoadDiskPartitions(PEXT2_DISK Disk); VOID Ext2LoadAllDiskPartitions(); VOID Ext2MountingVolumes(); BOOL Ext2LoadVolumes(); VOID Ext2LoadAllVolumeDrvLetters(); BOOL Ext2LoadRemovableVolumes(); CString Ext2QueryVolumeLetterStrings( ULONGLONG letters, PEXT2_LETTER * first ); VOID Ext2RefreshVLVI( CListCtrl *List, PEXT2_VOLUME chain, int nItem ); VOID Ext2InsertVolume( CListCtrl *List, PEXT2_VOLUME chain ); VOID Ext2RefreshVLCD( CListCtrl *List, PEXT2_CDROM Cdrom, int nItem ); VOID Ext2InsertCdromAsVolume( CListCtrl *List, PEXT2_CDROM Cdrom ); VOID Ext2RefreshVolumeList(CListCtrl *List); VOID Ext2RefreshDVPT( CListCtrl* List, PEXT2_PARTITION Part, int nItem ); VOID Ext2InsertPartition( CListCtrl* List, PEXT2_DISK Disk, PEXT2_PARTITION Part ); VOID Ext2InsertDisk( CListCtrl *List, PEXT2_DISK Disk ); VOID Ext2RefreshDVCM( CListCtrl *List, PEXT2_CDROM Cdrom, int nItem ); VOID Ext2InsertCdromAsDisk( CListCtrl *List, PEXT2_CDROM Cdrom ); VOID Ext2RefreshDiskList(CListCtrl *List); VOID Ext2CleanupVolumes(); VOID Ext2LoadDrvLetter(PEXT2_LETTER drvLetter, CHAR cLetter); VOID Ext2LoadDrvLetters(); VOID Ext2CleanDrvLetter(PEXT2_LETTER drvLetter); VOID Ext2CleanupDrvLetters(); BOOL Ext2RemoveDrvLetter( PEXT2_LETTER drvLetter ); BOOL Ext2RemoveDriveLetter(CHAR DrvLetter); CHAR Ext2QueryRegistryMountPoint ( CHAR * devName ); BOOL Ext2SetRegistryMountPoint ( CHAR * dosPath, CHAR * devName, BOOL bSet ); BOOL Ext2InsertMountPoint( CHAR * volume, UCHAR drvChar, BOOL bGlobal ); VOID Ext2UpdateDrvLetter( PEXT2_LETTER drvLetter, PCHAR devPath ); BOOL Ext2AssignDrvLetter( PEXT2_LETTER drvLetter, PCHAR devPath, BOOL bPermanent ); BOOL Ext2IsDrvLetterAvailable(CHAR drive); CHAR Ext2MountVolume(CHAR *voldev); CHAR Ext2MountVolumeAs(CHAR *voldev, CHAR letter); VOID Ext2RemoveMountPoint( PEXT2_LETTER drvLetter, BOOL bPermanent ); BOOL Ext2SymLinkRemoval(CHAR drvLetter); BOOL Ext2SetVolumeMountPoint ( CHAR * dosPath, CHAR * devName ); UCHAR Ext2QueryMountPoint( CHAR * volume ); BOOL Ext2RefreshVolumePoint( CHAR * volume, UCHAR drvChar ); BOOL Ext2NotifyVolumePoint( PEXT2_VOLUME volume, UCHAR drvChar ); BOOL Ext2VolumeArrivalNotify(PCHAR VolumePath); BOOL Ext2SetAppAutorun(BOOL bInstall); BOOL Ext2RunMgrForCurrentUser(); int Ext2SetManagerAsService(BOOL bInstall); extern BOOL g_bAutoRemoveDeadLetters; VOID Ext2AddLetterMask(ULONGLONG LetterMask); VOID Ext2AutoRemoveDeadLetters(); BOOL Ext2RemoveDosSymLink(CHAR drvChar); BOOL Ext2DismountVolume(CHAR *voldev); #ifdef __cplusplus extern "C" { #endif BOOL WINAPI WTSQueryUserToken( ULONG SessionId, PHANDLE phToken ); BOOL WINAPI ConvertStringSidToSidA( LPCTSTR StringSid, PSID* Sid ); WINUSERAPI HWND WINAPI GetShellWindow( VOID); #ifdef __cplusplus } #endif #endif // _ENUM_DISK_INCLUDE_