|
@@ -0,0 +1,246 @@
|
|
|
|
+unit StoreMgr;
|
|
|
|
+
|
|
|
|
+{$PACKSET 1}
|
|
|
|
+{$mode objfpc}
|
|
|
|
+
|
|
|
|
+(*
|
|
|
|
+
|
|
|
|
+ Store Manager API
|
|
|
|
+ (storemgr.h)
|
|
|
|
+
|
|
|
|
+*)
|
|
|
|
+
|
|
|
|
+//
|
|
|
|
+// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// Use of this sample source code is subject to the terms of the Microsoft
|
|
|
|
+// license agreement under which you licensed this sample source code. If
|
|
|
|
+// you did not accept the terms of the license agreement, you are not
|
|
|
|
+// authorized to use this sample source code. For the terms of the license,
|
|
|
|
+// please see the license agreement between you and Microsoft or, if applicable,
|
|
|
|
+// see the LICENSE.RTF on your install media or the root of your tools installation.
|
|
|
|
+// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
|
|
|
|
+//
|
|
|
|
+
|
|
|
|
+interface
|
|
|
|
+
|
|
|
|
+uses
|
|
|
|
+ Windows;
|
|
|
|
+
|
|
|
|
+const
|
|
|
|
+ BLOCK_DRIVER_GUID: GUID = '{A4E7EDDA-E575-4252-9D6B-4195D48BB865}';
|
|
|
|
+ STORE_MOUNT_GUID: GUID = '{C1115848-46FD-4976-BDE9-D79448457004}';
|
|
|
|
+ FATFS_MOUNT_GUID: GUID = '{169E1941-04CE-4690-97AC-776187EB67CC}';
|
|
|
|
+ CDFS_MOUNT_GUID: GUID = '{72D75746-D54A-4487-B7A1-940C9A3F259A}';
|
|
|
|
+ UDFS_MOUNT_GUID: GUID = '{462FEDA9-D478-4b00-86BB-51A8E3D10890}';
|
|
|
|
+ CDDA_MOUNT_GUID: GUID = '{BA6B1343-7980-4d0c-9290-762D527B33AB}';
|
|
|
|
+ FSD_MOUNT_GUID: GUID = '{8C77EDE8-47B9-45ae-8BC9-86E7B8D00EDD}';
|
|
|
|
+ BOOTFS_MOUNT_GUID: GUID = '{9A1E75E9-B24A-4838-B448-C026CA01323C}';
|
|
|
|
+ ROOTFS_MOUNT_GUID: GUID = '{0473DD50-D4CA-4ae2-BF5C-F09FD611C1CF}';
|
|
|
|
+ ROMFS_MOUNT_GUID: GUID = '{945E7231-17C0-4753-AD4E-BEFCA2FA6AE2}';
|
|
|
|
+ STORAGE_MEDIA_GUID: GUID = '{54CA35ED-CAF3-4b34-BC6B-6DFC7F22E6A9}';
|
|
|
|
+
|
|
|
|
+ BLOCK_DRIVER_GUID_STRING = '{A4E7EDDA-E575-4252-9D6B-4195D48BB865}';
|
|
|
|
+ STORE_MOUNT_GUID_STRING = '{C1115848-46FD-4976-BDE9-D79448457004}';
|
|
|
|
+ FATFS_MOUNT_GUID_STRING = '{169E1941-04CE-4690-97AC-776187EB67CC}';
|
|
|
|
+ CDFS_MOUNT_GUID_STRING = '{72D75746-D54A-4487-B7A1-940C9A3F259A}';
|
|
|
|
+ UDFS_MOUNT_GUID_STRING = '{462FEDA9-D478-4b00-86BB-51A8E3D10890}';
|
|
|
|
+ CDDA_MOUNT_GUID_STRING = '{BA6B1343-7980-4d0c-9290-762D527B33AB}';
|
|
|
|
+ FSD_MOUNT_GUID_STRING = '{8C77EDE8-47B9-45ae-8BC9-86E7B8D00EDD}';
|
|
|
|
+ BOOTFS_MOUNT_GUID_STRING = '{9A1E75E9-B24A-4838-B448-C026CA01323C}';
|
|
|
|
+ ROOTFS_MOUNT_GUID_STRING = '{0473DD50-D4CA-4ae2-BF5C-F09FD611C1CF}';
|
|
|
|
+ ROMFS_MOUNT_GUID_STRING = '{945E7231-17C0-4753-AD4E-BEFCA2FA6AE2}';
|
|
|
|
+
|
|
|
|
+ STOREMGR_DRIVER_GUID: GUID = '{14ACDEE6-5CF3-496b-B39D-8954C96DF002}';
|
|
|
|
+ STOREMGR_DRIVER_GUID_STRING = '{14ACDEE6-5CF3-496b-B39D-8954C96DF002}';
|
|
|
|
+
|
|
|
|
+ //*****************************************************************************/
|
|
|
|
+ //* attributes of a store */
|
|
|
|
+ STORE_ATTRIBUTE_READONLY = $00000001;
|
|
|
|
+ STORE_ATTRIBUTE_REMOVABLE = $00000002;
|
|
|
|
+ STORE_ATTRIBUTE_UNFORMATTED = $00000004;
|
|
|
|
+ STORE_ATTRIBUTE_AUTOFORMAT = $00000008;
|
|
|
|
+ STORE_ATTRIBUTE_AUTOPART = $00000010;
|
|
|
|
+ STORE_ATTRIBUTE_AUTOMOUNT = $00000020;
|
|
|
|
+
|
|
|
|
+ //* attributes for a partition */
|
|
|
|
+ PARTITION_ATTRIBUTE_EXPENDABLE = $00000001; // partition may be trashed
|
|
|
|
+ PARTITION_ATTRIBUTE_READONLY = $00000002; // partition is read-only
|
|
|
|
+ PARTITION_ATTRIBUTE_AUTOFORMAT = $00000004;
|
|
|
|
+ PARTITION_ATTRIBUTE_ACTIVE = $00000008;
|
|
|
|
+ PARTITION_ATTRIBUTE_BOOT = $00000008; // Active(DOS) == Boot(CE)
|
|
|
|
+ PARTITION_ATTRIBUTE_MOUNTED = $00000010;
|
|
|
|
+
|
|
|
|
+ //* some basic constants */
|
|
|
|
+ DEVICENAMESIZE = 8;
|
|
|
|
+ STORENAMESIZE = 32;
|
|
|
|
+ FILESYSNAMESIZE = 32;
|
|
|
|
+ FORMATNAMESIZE = 32;
|
|
|
|
+ PARTITIONNAMESIZE = 32;
|
|
|
|
+ PROFILENAMESIZE = 32;
|
|
|
|
+ FOLDERNAMESIZE = 32;
|
|
|
|
+ VOLUMENAMESIZE = 64;
|
|
|
|
+ FSDDESCSIZE = 32;
|
|
|
|
+
|
|
|
|
+ STORAGE_DEVICE_CLASS_BLOCK = $1;
|
|
|
|
+ STORAGE_DEVICE_CLASS_MULTIMEDIA = $2;
|
|
|
|
+
|
|
|
|
+ STORAGE_DEVICE_TYPE_PCIIDE = (1 shl 0);
|
|
|
|
+ STORAGE_DEVICE_TYPE_FLASH = (1 shl 1);
|
|
|
|
+ STORAGE_DEVICE_TYPE_ATA = (1 shl 2);
|
|
|
|
+ STORAGE_DEVICE_TYPE_ATAPI = (1 shl 4);
|
|
|
|
+ STORAGE_DEVICE_TYPE_PCCARD = (1 shl 5);
|
|
|
|
+ STORAGE_DEVICE_TYPE_CFCARD = (1 shl 6);
|
|
|
|
+ STORAGE_DEVICE_TYPE_SRAM = (1 shl 7);
|
|
|
|
+ STORAGE_DEVICE_TYPE_DVD = (1 shl 8);
|
|
|
|
+ STORAGE_DEVICE_TYPE_CDROM = (1 shl 9);
|
|
|
|
+ STORAGE_DEVICE_TYPE_USB = (1 shl 10);
|
|
|
|
+ STORAGE_DEVICE_TYPE_1394 = (1 shl 11);
|
|
|
|
+ STORAGE_DEVICE_TYPE_DOC = (1 shl 12);
|
|
|
|
+ STORAGE_DEVICE_TYPE_UNKNOWN = (1 shl 29);
|
|
|
|
+ STORAGE_DEVICE_TYPE_REMOVABLE_DRIVE = (1 shl 30); // Drive itself is removable
|
|
|
|
+ STORAGE_DEVICE_TYPE_REMOVABLE_MEDIA = (1 shl 31); // Just the media is removable ex. CDROM, FLOPPY
|
|
|
|
+
|
|
|
|
+ STORAGE_DEVICE_FLAG_READWRITE = (1 shl 0);
|
|
|
|
+ STORAGE_DEVICE_FLAG_READONLY = (1 shl 1);
|
|
|
|
+ STORAGE_DEVICE_FLAG_TRANSACTED = (1 shl 2);
|
|
|
|
+ STORAGE_DEVICE_FLAG_MEDIASENSE = (1 shl 3); // Device requires media sense calls
|
|
|
|
+ STORAGE_DEVICE_FLAG_XIP = (1 shl 4);
|
|
|
|
+
|
|
|
|
+ CE_VOLUME_ATTRIBUTE_READONLY = $1;
|
|
|
|
+ CE_VOLUME_ATTRIBUTE_HIDDEN = $2;
|
|
|
|
+ CE_VOLUME_ATTRIBUTE_REMOVABLE = $4;
|
|
|
|
+ CE_VOLUME_ATTRIBUTE_SYSTEM = $8;
|
|
|
|
+ CE_VOLUME_ATTRIBUTE_BOOT = $10;
|
|
|
|
+
|
|
|
|
+ CE_VOLUME_TRANSACTION_SAFE = $1; // Performs transaction safe operations
|
|
|
|
+ CE_VOLUME_FLAG_TRANSACT_WRITE = $2;
|
|
|
|
+ CE_VOLUME_FLAG_WFSC_SUPPORTED = $4;
|
|
|
|
+ CE_VOLUME_FLAG_LOCKFILE_SUPPORTED = $8;
|
|
|
|
+ CE_VOLUME_FLAG_NETWORK = $10;
|
|
|
|
+ CE_VOLUME_FLAG_STORE = $20;
|
|
|
|
+ CE_VOLUME_FLAG_RAMFS = $40;
|
|
|
|
+ CE_VOLUME_FLAG_FILE_SECURITY_SUPPORTED = $80; // Persistent file and directory security descriptors
|
|
|
|
+ CE_VOLUME_FLAG_64BIT_FILES_SUPPORTED = $100; // 64-bit file sizes and offsets
|
|
|
|
+
|
|
|
|
+ STOREAPIDLL = 'coredll';
|
|
|
|
+
|
|
|
|
+type
|
|
|
|
+ SECTORNUM = ULONGLONG;
|
|
|
|
+
|
|
|
|
+ //****************************************************************************
|
|
|
|
+
|
|
|
|
+ STORAGEDEVICEINFO = record
|
|
|
|
+ cbSize: DWORD;
|
|
|
|
+ szProfile: array[0..PROFILENAMESIZE-1] of TCHAR;
|
|
|
|
+ dwDeviceClass: DWORD;
|
|
|
|
+ dwDeviceType: DWORD;
|
|
|
|
+ dwDeviceFlags: DWORD;
|
|
|
|
+ end;
|
|
|
|
+ tagSTORAGEDEVICEINFO = STORAGEDEVICEINFO;
|
|
|
|
+ TSTORAGEDEVICEINFO = STORAGEDEVICEINFO;
|
|
|
|
+ PSTORAGEDEVICEINFO = ^STORAGEDEVICEINFO;
|
|
|
|
+
|
|
|
|
+ //*****************************************************************************/
|
|
|
|
+ // information about a store */
|
|
|
|
+ STOREINFO = record
|
|
|
|
+ cbSize: DWORD; // sizeof(PD_STOREINFO)
|
|
|
|
+ szDeviceName: array[0..DEVICENAMESIZE-1] of TCHAR;
|
|
|
|
+ szStoreName: array[0..STORENAMESIZE-1] of TCHAR;
|
|
|
|
+ dwDeviceClass: DWORD;
|
|
|
|
+ dwDeviceType: DWORD;
|
|
|
|
+ sdi: STORAGEDEVICEINFO;
|
|
|
|
+ dwDeviceFlags: DWORD;
|
|
|
|
+ snNumSectors: SECTORNUM; // number of sectors on store
|
|
|
|
+ dwBytesPerSector: DWORD; // number of bytes per sector
|
|
|
|
+ snFreeSectors: SECTORNUM; // number of unallocated sectors
|
|
|
|
+ snBiggestPartCreatable: SECTORNUM; // biggest partition currently creatable
|
|
|
|
+ ftCreated: FILETIME; // last time store was formatted
|
|
|
|
+ ftLastModified: FILETIME; // last time partition table was modified
|
|
|
|
+ dwAttributes: DWORD; // store attributes, see below
|
|
|
|
+ dwPartitionCount: DWORD; // Number of Partitions
|
|
|
|
+ dwMountCount: DWORD; // Number of partitions that have been mounted
|
|
|
|
+ end;
|
|
|
|
+ tagSTOREINFO = STOREINFO;
|
|
|
|
+ TSTOREINFO = STOREINFO;
|
|
|
|
+ PSTOREINFO = ^STOREINFO;
|
|
|
|
+
|
|
|
|
+ //***************************************************************************
|
|
|
|
+ // information about a partition
|
|
|
|
+ PARTINFO = record
|
|
|
|
+ cbSize: DWORD; // sizeof(PD_PARTINFO)
|
|
|
|
+ szPartition: array[0..PARTITIONNAMESIZE-1] of TCHAR; // name of partition
|
|
|
|
+ szFileSys: array[0..FILESYSNAMESIZE-1] of TCHAR;
|
|
|
|
+ szVolumeName: array[0..VOLUMENAMESIZE-1] of TCHAR;
|
|
|
|
+ snNumSectors: SECTORNUM; // number of sectors in partition
|
|
|
|
+ ftCreated: FILETIME; // creation time of partition
|
|
|
|
+ ftLastModified: FILETIME; // last time partition was modified
|
|
|
|
+ dwAttributes: DWORD; // partition attributes, see below
|
|
|
|
+ bPartType: BYTE;
|
|
|
|
+ end;
|
|
|
|
+ tagPARTINFO = PARTINFO;
|
|
|
|
+ TPARTINFO = PARTINFO;
|
|
|
|
+ PPARTINFO = ^PARTINFO;
|
|
|
|
+
|
|
|
|
+ //****************************************************************************/
|
|
|
|
+
|
|
|
|
+ STORAGECONTEXT = record
|
|
|
|
+ cbSize: DWORD;
|
|
|
|
+ StoreInfo: STOREINFO;
|
|
|
|
+ PartInfo: PARTINFO;
|
|
|
|
+ dwFlags: DWORD;
|
|
|
|
+ end;
|
|
|
|
+ tagSTORAGECONTEXT = STORAGECONTEXT;
|
|
|
|
+ TSTORAGECONTEXT = STORAGECONTEXT;
|
|
|
|
+ PSTORAGECONTEXT = ^STORAGECONTEXT;
|
|
|
|
+
|
|
|
|
+ CE_VOLUME_INFO = record
|
|
|
|
+ cbSize: DWORD;
|
|
|
|
+ dwAttributes: DWORD;
|
|
|
|
+ dwFlags: DWORD;
|
|
|
|
+ dwBlockSize: DWORD;
|
|
|
|
+ szStoreName: array[0..STORENAMESIZE-1] of TCHAR;
|
|
|
|
+ szPartitionName: array[0..PARTITIONNAMESIZE-1] of TCHAR;
|
|
|
|
+ end;
|
|
|
|
+ _CE_VOLUME_INFO = CE_VOLUME_INFO;
|
|
|
|
+ PCE_VOLUME_INFO = ^CE_VOLUME_INFO;
|
|
|
|
+ LPCE_VOLUME_INFO = ^CE_VOLUME_INFO;
|
|
|
|
+
|
|
|
|
+ CE_VOLUME_INFO_LEVEL = (CeVolumeInfoLevelStandard);
|
|
|
|
+ _CE_VOLUME_INFO_LEVEL = CE_VOLUME_INFO_LEVEL;
|
|
|
|
+
|
|
|
|
+function IsStorageManagerRunning: BOOL; cdecl; external STOREAPIDLL name 'IsStorageManagerRunning';
|
|
|
|
+// Storage Management API's
|
|
|
|
+function OpenStore(szDeviceName: LPCTSTR): HANDLE; cdecl; external STOREAPIDLL name 'OpenStore';
|
|
|
|
+function DismountStore(hStore: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'DismountStore';
|
|
|
|
+function FormatStore(hStore: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'FormatStore';
|
|
|
|
+function FindFirstStore(pStoreInfo: PSTOREINFO): HANDLE; cdecl; external STOREAPIDLL name 'FindFirstStore';
|
|
|
|
+function FindNextStore(hSearch: HANDLE; pStoreInfo: PSTOREINFO): BOOL; cdecl; external STOREAPIDLL name 'FindNextStore';
|
|
|
|
+function FindCloseStore(hSearch: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'FindCloseStore';
|
|
|
|
+function GetStoreInfo(hStore: HANDLE; pStoreInfo: PSTOREINFO): BOOL; cdecl; external STOREAPIDLL name 'GetStoreInfo';
|
|
|
|
+// Partition Management API's
|
|
|
|
+function CreatePartition(hStore: HANDLE; szPartitionName: LPCTSTR; snNumSectors: SECTORNUM): BOOL; cdecl; external STOREAPIDLL name 'CreatePartition';
|
|
|
|
+function CreatePartitionEx(hStore: HANDLE; szPartitionName: LPCTSTR; bPartType: BYTE; snNumSectors: SECTORNUM): BOOL; cdecl; external STOREAPIDLL name 'CreatePartitionEx';
|
|
|
|
+function DeletePartition(hStore: HANDLE; szPartitionName: LPCTSTR): BOOL; cdecl; external STOREAPIDLL name 'DeletePartition';
|
|
|
|
+function OpenPartition(hStore: HANDLE; szPartitionName: LPCTSTR): HANDLE; cdecl; external STOREAPIDLL name 'OpenPartition';
|
|
|
|
+function MountPartition(hPartition: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'MountPartition';
|
|
|
|
+function DismountPartition(hPartition: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'DismountPartition';
|
|
|
|
+function RenamePartition(hPartition: HANDLE; szNewName: LPCTSTR): BOOL; cdecl; external STOREAPIDLL name 'RenamePartition';
|
|
|
|
+function SetPartitionAttributes(hPartition: HANDLE; dwAttrs: DWORD): BOOL; cdecl; external STOREAPIDLL name 'SetPartitionAttributes';
|
|
|
|
+function GetPartitionInfo(hPartition: HANDLE; pPartInfo: PPARTINFO): BOOL; cdecl; external STOREAPIDLL name 'GetPartitionInfo';
|
|
|
|
+function FormatPartition(hPartition: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'FormatPartition';
|
|
|
|
+function FormatPartitionEx(hPartition: HANDLE; bPartType: BYTE; bAuto: BOOL): BOOL; cdecl; external STOREAPIDLL name 'FormatPartitionEx';
|
|
|
|
+function FindFirstPartition(hStore: HANDLE; pPartInfo: PPARTINFO): HANDLE; cdecl; external STOREAPIDLL name 'FindFirstPartition';
|
|
|
|
+function FindNextPartition(hSearch: HANDLE; pPartInfo: PPARTINFO): BOOL; cdecl; external STOREAPIDLL name 'FindNextPartition';
|
|
|
|
+function FindClosePartition(hSearch: HANDLE): BOOL; cdecl; external STOREAPIDLL name 'FindClosePartition';
|
|
|
|
+
|
|
|
|
+function CeGetVolumeInfoW(pszRootPath: LPCWSTR; InfoLevel: CE_VOLUME_INFO_LEVEL;
|
|
|
|
+ lpVolumeInfo: LPCE_VOLUME_INFO): BOOL; cdecl; external STOREAPIDLL name 'CeGetVolumeInfoW';
|
|
|
|
+function CeGetVolumeInfo(pszRootPath: LPCWSTR; InfoLevel: CE_VOLUME_INFO_LEVEL;
|
|
|
|
+ lpVolumeInfo: LPCE_VOLUME_INFO): BOOL; cdecl; external STOREAPIDLL name 'CeGetVolumeInfoW';
|
|
|
|
+
|
|
|
|
+implementation
|
|
|
|
+
|
|
|
|
+end.
|
|
|
|
+
|