electrik | Дата: Среда, 12.08.2015, 17:04 | Сообщение # 1 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| задача следующая. есть консольный soft, который не знает про диски c: d: e: и т.д. а знает он номера типа: disk0\partition1, disk1:partition1. м1. получить phisical номер диска и партиции по букве - (не всегда возможно, ибо может буквы и не быть), например после краха), но такой механизм всё-равно нужен. 2. получить все физические носители, получить физические номера разделов, у системы спросить букву, если таковая примонтирована к данному разделу. мне не обязательно строка типа disk0\partition1, достаточно физического номера диска и его раздела.
|
|
| |
haav | Дата: Среда, 12.08.2015, 18:29 | Сообщение # 2 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Вроде то, что тебе нужно: http://www.realcoding.net/article/view/4241
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Пятница, 21.08.2015, 13:39 | Сообщение # 3 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| не, не совсем то. тут ситуация такая, мне надо найти физические носители. покурив msdn, написал такой код:
Код #include "windows.bi"
dim as zstring * MAX_PATH DeviceName dim as zstring * MAX_PATH VolumeName dim as zstring * MAX_PATH VolumePath dim as HANDLE FindHandle dim index as integer
FindHandle = FindFirstVolume(@VolumeName,sizeof(VolumeName)) do index=lstrlen(VolumeName)-1 VolumeName[index]=0 QueryDosDevice(@VolumeName[4],@DeviceName,sizeof(DeviceName)) VolumeName [Index]= asc("\") print DeviceName print VolumeName GetVolumePathNamesForVolumeName(@VolumeName,@VolumePath,260,0) print VolumePath loop while FindNextVolume(FindHandle, @VolumeName, sizeof(VolumeName)) FindVolumeClose(FindHandle) sleep
но это, к сожалению тоже не то. эта программа возвращает типа: \Device\HarddiskVolume1 \Device\HarddiskVolume6 \Device\HarddiskVolume2 и т.д. то есть, возвращает порядок в котором расположены диски в системе. нет различия между cd и хардом. а надо так: \Device\Harddisk1\Partition1 \Device\Harddisk1\Partition2 \Device\Harddisk2\Partition1 \device\rm1\partition1 и т.д первая цифра, номер устройства, причем это может быть и флопешник и сидюк и т.д. вторая цифра - это раздел на диске, ну или партишен. ладно, буду дальше думать. странно, что не так всё просто. в этом плане линуксойдам повезло, там изначально всё так названо.Добавлено (21.08.2015, 13:39) --------------------------------------------- решение найдено. сразу скажу, что оно нормально будет работать тогда, когда нет таких извращений как несколько замонтированных жестких дисков как одна буква диска. это касается второго примера.
первый пример, выводит физические номера жестких дисков, и разделов на них и ещё кое какую инфу. второй преобразует букву диска к физическому номеру устройства и если есть раздел его номер. все упрощено и если что-то надо замутить подробно вот ссылка на описание на msdn: https://msdn.microsoft.com/en-us....29.aspx
поскольку, заголовочные файлы ddk во FreeBasic не полные, тут будет парочку тоже не полных, но дополняющих нужное для примеров. корректно работает в скомпилированном варианте под x86. для x64 номера дисков и преобразование буквы в физический номер, работает корректно, а вот некоторая инфа, почему-то не выводится. тут, возможно, дело в выравнивании структур. все примеры работают исключительно с правами администратора, ну так в целях безопасности решили microsoft.
пример 1. файл devioctl.bi
Код /' * devioctl.h * * IOCTL definitions * * This file is part of the ReactOS PSDK package. * * Contributors: * Amine Khaldi * Timo Kreuzer (timo.kreuzer@reactos.org) * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * '/ #pragma once
#ifndef _DEVIOCTL_ #define _DEVIOCTL_
#define FILE_DEVICE_BEEP &H00000001 #define FILE_DEVICE_CD_ROM &H00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM &H00000003 #define FILE_DEVICE_CONTROLLER &H00000004 #define FILE_DEVICE_DATALINK &H00000005 #define FILE_DEVICE_DFS &H00000006 #define FILE_DEVICE_DISK &H00000007 #define FILE_DEVICE_DISK_FILE_SYSTEM &H00000008 #define FILE_DEVICE_FILE_SYSTEM &H00000009 #define FILE_DEVICE_INPORT_PORT &H0000000a #define FILE_DEVICE_KEYBOARD &H0000000b #define FILE_DEVICE_MAILSLOT &H0000000c #define FILE_DEVICE_MIDI_IN &H0000000d #define FILE_DEVICE_MIDI_OUT &H0000000e #define FILE_DEVICE_MOUSE &H0000000f #define FILE_DEVICE_MULTI_UNC_PROVIDER &H00000010 #define FILE_DEVICE_NAMED_PIPE &H00000011 #define FILE_DEVICE_NETWORK &H00000012 #define FILE_DEVICE_NETWORK_BROWSER &H00000013 #define FILE_DEVICE_NETWORK_FILE_SYSTEM &H00000014 #define FILE_DEVICE_NULL &H00000015 #define FILE_DEVICE_PARALLEL_PORT &H00000016 #define FILE_DEVICE_PHYSICAL_NETCARD &H00000017 #define FILE_DEVICE_PRINTER &H00000018 #define FILE_DEVICE_SCANNER &H00000019 #define FILE_DEVICE_SERIAL_MOUSE_PORT &H0000001a #define FILE_DEVICE_SERIAL_PORT &H0000001b #define FILE_DEVICE_SCREEN &H0000001c #define FILE_DEVICE_SOUND &H0000001d #define FILE_DEVICE_STREAMS &H0000001e #define FILE_DEVICE_TAPE &H0000001f #define FILE_DEVICE_TAPE_FILE_SYSTEM &H00000020 #define FILE_DEVICE_TRANSPORT &H00000021 #define FILE_DEVICE_UNKNOWN &H00000022 #define FILE_DEVICE_VIDEO &H00000023 #define FILE_DEVICE_VIRTUAL_DISK &H00000024 #define FILE_DEVICE_WAVE_IN &H00000025 #define FILE_DEVICE_WAVE_OUT &H00000026 #define FILE_DEVICE_8042_PORT &H00000027 #define FILE_DEVICE_NETWORK_REDIRECTOR &H00000028 #define FILE_DEVICE_BATTERY &H00000029 #define FILE_DEVICE_BUS_EXTENDER &H0000002a #define FILE_DEVICE_MODEM &H0000002b #define FILE_DEVICE_VDM &H0000002c #define FILE_DEVICE_MASS_STORAGE &H0000002d #define FILE_DEVICE_SMB &H0000002e #define FILE_DEVICE_KS &H0000002f #define FILE_DEVICE_CHANGER &H00000030 #define FILE_DEVICE_SMARTCARD &H00000031 #define FILE_DEVICE_ACPI &H00000032 #define FILE_DEVICE_DVD &H00000033 #define FILE_DEVICE_FULLSCREEN_VIDEO &H00000034 #define FILE_DEVICE_DFS_FILE_SYSTEM &H00000035 #define FILE_DEVICE_DFS_VOLUME &H00000036 #define FILE_DEVICE_SERENUM &H00000037 #define FILE_DEVICE_TERMSRV &H00000038 #define FILE_DEVICE_KSEC &H00000039 #define FILE_DEVICE_FIPS &H0000003A #define FILE_DEVICE_INFINIBAND &H0000003B #define FILE_DEVICE_VMBUS &H0000003E #define FILE_DEVICE_CRYPT_PROVIDER &H0000003F #define FILE_DEVICE_WPD &H00000040 #define FILE_DEVICE_BLUETOOTH &H00000041 #define FILE_DEVICE_MT_COMPOSITE &H00000042 #define FILE_DEVICE_MT_TRANSPORT &H00000043 #define FILE_DEVICE_BIOMETRIC &H00000044 #define FILE_DEVICE_PMI &H00000045
/' DEVICE_OBJECT.DeviceType '/ #define DEVICE_TYPE ULONG
#define CTL_CODE(DeviceType, Function, Method, Access) _ (((DeviceType) shl 16) or ((Access) shl 14) or ((Function) shl 2) or (Method))
#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (( cast(ULONG,(ctl and &Hffff0000))) shr 16)
#define METHOD_FROM_CTL_CODE(ctrlCode) (cast(ULONG,(ctrlCode and 3)))
#define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 #define METHOD_NEITHER 3
#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
#define FILE_ANY_ACCESS &H00000000 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS #define FILE_READ_ACCESS &H00000001 #define FILE_WRITE_ACCESS &H00000002
#endif /'_DEVIOCTL_ '/
файл ntdddisk.bi
Код #IFNDEF __ntdddisk_bi__ #define __ntdddisk_bi_
#define IOCTL_DISK_BASE FILE_DEVICE_DISK
#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX _ CTL_CODE(IOCTL_DISK_BASE, &H0028, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX _ CTL_CODE(IOCTL_DISK_BASE, &H0014, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_DISK_GET_LENGTH_INFO _ CTL_CODE(IOCTL_DISK_BASE, &H0017, METHOD_BUFFERED, FILE_READ_ACCESS)
enum PARTITION_STYLE PARTITION_STYLE_MBR= 0 PARTITION_STYLE_GPT = 1 PARTITION_STYLE_RAW = 2 end enum
enum MEDIA_TYPE Unknown F5_1Pt2_512 F3_1Pt44_512 F3_2Pt88_512 F3_20Pt8_512 F3_720_512 F5_360_512 F5_320_512 F5_320_1024 F5_180_512 F5_160_512 RemovableMedia FixedMedia, F3_120M_512 F3_640_512 F5_640_512 F5_720_512 F3_1Pt2_512 F3_1Pt23_1024 F5_1Pt23_1024 F3_128Mb_512 F3_230Mb_512 F8_256_128 end enum
type DISK_GEOMETRY as LARGE_INTEGER Cylinders as MEDIA_TYPE MediaType as ULONG TracksPerCylinder as ULONG SectorsPerTrack as ULONG BytesPerSector end type
type DISK_GEOMETRY_EX as DISK_GEOMETRY Geometry as LARGE_INTEGER DiskSize as UCHAR Data(0) end type
type GET_LENGTH_INFORMATION as LARGE_INTEGER Length end type
type PARTITION_INFORMATION_MBR as UCHAR PartitionType as BOOLEAN BootIndicator as BOOLEAN RecognizedPartition as ULONG HiddenSectors end type
type PARTITION_INFORMATION_GPT as GUID PartitionType as GUID PartitionId as ULONG64 Attributes as wstring * 36 Name end type
type PARTITION_INFORMATION_EX as PARTITION_STYLE PartitionStyle as LARGE_INTEGER StartingOffset as LARGE_INTEGER PartitionLength as ULONG PartitionNumber as BOOLEAN RewritePartition union as PARTITION_INFORMATION_MBR Mbr as PARTITION_INFORMATION_GPT Gpt end union end type
type DRIVE_LAYOUT_INFORMATION_MBR as ULONG Signature end type
type DRIVE_LAYOUT_INFORMATION_GPT as GUID DiskId as LARGE_INTEGER StartingUsableOffset as LARGE_INTEGER UsableLength as ULONG MaxPartitionCount end type
type DRIVE_LAYOUT_INFORMATION_EX as ULONG PartitionStyle as ULONG PartitionCount union as DRIVE_LAYOUT_INFORMATION_MBR Mbr as DRIVE_LAYOUT_INFORMATION_GPT Gpt end union as PARTITION_INFORMATION_EX PartitionEntry(0) end type #ENDIF
файл disk.bas
Код #define unicode #include "windows.bi" #include "devioctl.bi" #include "ntdddisk.bi"
function GetPartitionType(byval pType as integer) as wstring ptr Select case pType Case 0 return @"Unused" Case 1 return @"12-bit FAT" Case 2, 3 return @"Xenix" Case 4 return @"16-bit FAT" Case 5 return @"Extended" Case 6 return @"Huge partition MS-DOS V4" Case 7 return @"Installable File System (NTFS/HPFS/FAT64)" Case 8 return @"OS/2 (v1.0-1.3 only)/AIX boot partition/Commodore DOS/SplitDrive/DELL partition spanning multiple drives/QNX 1.x and 2.x (qny)" Case 9 return @"AIX data partition/Coherent filesystem/QNX 1.x and 2.x (qnz)" Case &HA return @"OS/2 Boot Manager/OPUS/Coherent swap" Case &HB return @"FAT32" Case &HC return @"FAT32 using extended int13 services" Case &HE return @"Win95 partition using extended int13 services" Case &HF return @"Extended using extended int13 services" Case &H41 return @"PowerPC Reference Platform (PReP) Boot Partition" Case &H42 return @"Logical Disk Manager partition" Case &H63 return @"Unix" Case &HC0 return @"NTFT uses high order bits" Case &H80 return @"NTFT" End Select end function
#define infoSize sizeof(DRIVE_LAYOUT_INFORMATION_EX)+(sizeof(PARTITION_INFORMATION_EX)*26) dim as DRIVE_LAYOUT_INFORMATION_EX ptr dli = CAllocate(infoSize ,1)
for i as integer = 0 to 26 dim as long BytesRet dim as HANDLE hDisk = CreateFile("\\.\physicalDrive" & Str(i),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE,0, OPEN_EXISTING, 0, 0) if hDisk = INVALID_HANDLE_VALUE then continue for
DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_LAYOUT_EX, Null,0,dli, infoSize, @BytesRet,0) If BytesRet > 0 then dim as DISK_GEOMETRY_EX diskGeometry DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, Null,0,@diskGeometry, sizeof(DISK_GEOMETRY_EX), @BytesRet,0) If BytesRet > 0 then dim as string mediaType select case diskGeometry.Geometry.MediaType case RemovableMedia mediaType = "(removable disk)" case FixedMedia mediaType = "(Hard Disk)" end select print "disk " & Str(i) & " : type " & mediaType & ", length = " & str(*cast(ulongint ptr,@diskGeometry.DiskSize)) & " bytes"
For ii as integer =0 To dli->PartitionCount-1 if dli->PartitionEntry(ii).PartitionNumber > 0 then print "Partition " & WStr(dli->PartitionEntry(ii).PartitionNumber) & " : " & *GetPartitionType(dli->PartitionEntry(ii).mbr.PartitionType) & " , length = " & WStr(*cast(ulongint ptr,@dli->PartitionEntry(ii).PartitionLength)) & " bytes" end if next
print "-" EndIf EndIf if hDisk then CloseHandle(hDisk) Next deallocate(dli)
пример 2
Код #include "windows.bi" #include "devioctl.bi"
#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE #define IOCTL_STORAGE_GET_DEVICE_NUMBER _ CTL_CODE(IOCTL_STORAGE_BASE, &h0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
function GetDeviceType(byval deviceType as integer) as wstring ptr select case deviceType case FILE_DEVICE_CD_ROM function = @"Cd-rom" case FILE_DEVICE_CD_ROM_FILE_SYSTEM function = @"Cd-rom File system" case FILE_DEVICE_DISK function = @"Disk" case FILE_DEVICE_DISK_FILE_SYSTEM function = @"disk file system" case FILE_DEVICE_DVD function = @"Dvd" case FILE_DEVICE_FILE_SYSTEM function = @"File system" case FILE_DEVICE_MASS_STORAGE function = @"Mass storage" case FILE_DEVICE_NETWORK function = @"Network" case FILE_DEVICE_NETWORK_BROWSER function = @"Network browser" case FILE_DEVICE_NETWORK_FILE_SYSTEM function = @"Network file system" case FILE_DEVICE_VIRTUAL_DISK function = @"Virtual disk" end select end function
type STORAGE_DEVICE_NUMBER as DEVICE_TYPE DeviceType as ULONG DeviceNumber as ULONG PartitionNumber end type
function letterToPhysical(byval letter as wstring ptr) as long dim as long BytesRet dim as STORAGE_DEVICE_NUMBER sdn dim as HANDLE hDisk = CreateFile("\\.\" & *letter,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE,0, OPEN_EXISTING, 0, 0) if hDisk <> INVALID_HANDLE_VALUE then DeviceIoControl(hDisk,IOCTL_STORAGE_GET_DEVICE_NUMBER , Null,0,@sdn, sizeof(STORAGE_DEVICE_NUMBER), @BytesRet,0) closehandle(hDisk) if BytesRet then if sdn.partitionNumber = -1 then return 0 end if return makelong(sdn.deviceNumber,sdn.partitionNumber) end if end if end function
dim as long physical = LetterToPhysical("c:")
print loword(physical),, hiword(physical)
|
|
| |
haav | Дата: Суббота, 22.08.2015, 13:22 | Сообщение # 4 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Ну че сказать , молодец. Может когда пригодится.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |