FreeBasic
Главная
Вход
Регистрация
Воскресенье, 24.09.2017, 18:34Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » WinAPI » WinApi в freebasic » Как получить физические номера носителей информации
Как получить физические номера носителей информации
electrikДата: Среда, 12.08.2015, 17:04 | Сообщение # 1
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: Offline
задача следующая. есть консольный soft, который не знает про диски c: d: e: и т.д. а знает он номера типа: disk0\partition1, disk1:partition1.
м1. получить phisical номер диска и партиции по букве - (не всегда возможно, ибо может буквы и не быть), например после краха), но такой механизм всё-равно нужен.
2. получить все физические носители, получить физические номера разделов, у системы спросить букву, если таковая примонтирована к данному разделу.
мне не обязательно строка типа disk0\partition1, достаточно физического номера диска и его раздела.
 
haavДата: Среда, 12.08.2015, 18:29 | Сообщение # 2
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Вроде то, что тебе нужно: http://www.realcoding.net/article/view/4241

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 21.08.2015, 13:39 | Сообщение # 3
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: 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
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Ну че сказать , молодец. Может когда пригодится.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » WinAPI » WinApi в freebasic » Как получить физические номера носителей информации
Страница 1 из 11
Поиск: