Конференция "WinAPI" » Как определить HDD программы из под гостя? [D6, WinXP]
 
  • AllDontFire (04.06.08 02:46) [0]
    Привет Всем!

    Как определить с какого жёсткого диска запущена программа из под   юзера с ограниченными правами (Гость, например) ?

    Спасибо.
  • Renegat (04.06.08 10:52) [1]
    1) вызов GetModuleFilename с парамом 0.
    2) поиск в строке результата первого символа ":" и замена его нулевым байтом.
  • Renegat (04.06.08 10:53) [2]
    Впрочем, вместо пункта 1 сойдёт и обычный ParamStr(0).
  • Renegat (04.06.08 10:54) [3]
    блин. А вместо 2-го - Copy/Delete.
  • AllDontFire (04.06.08 11:32) [4]
    Мне нужно определить модель жёсткого диска (HDD) или его физический номер в системе как PhysicalDrive%d. А под гостём
    CreateFile(Pchar('\\.\PhysicalDrive'+inttostr(id)),..

    выдаёт Access denied. В этом и проблема.
  • Игорь Шевченко © (04.06.08 12:12) [5]

    > Мне нужно определить модель жёсткого диска (HDD) или его
    > физический номер в системе как PhysicalDrive%d. А под гостём
    > CreateFile(Pchar('\\.\PhysicalDrive'+inttostr(id)),.. выдаёт
    > Access denied. В этом и проблема.


    значит нельзя
  • AllDontFire (04.06.08 12:47) [6]
    А через "Scsi%d:" или что нибудь типа "QueryDosDevice" или "NtQuerySystemInformation"? чтобы уйти от обращения к PhysicalDrive%d
  • LightRipple © (04.06.08 13:20) [7]
    > [4] AllDontFire   (04.06.08 11:32)
    > Мне нужно определить модель жёсткого диска (HDD) или его физический номер в системе как PhysicalDrive%d.
    > А под гостём CreateFile(Pchar('\\.\PhysicalDrive'+inttostr(id)),.. выдаёт Access denied.

    Не могу проверить - нет Delphi под рукой,
    но готова отказаться от утренней чашки кофе, если это так :)

    IMHO либо не тот уровень доступа просишь, либо не так "расшариваешь".
  • guav © (04.06.08 13:39) [8]
    Под гостем даже \\.\C: не откроется.
  • Anatoly Podgoretsky © (04.06.08 14:23) [9]
    > 2) поиск в строке результата первого символа ":" и замена его нулевым байтом.

    Высоко будет твое удивление когда данного символа не будет найдено.
  • AllDontFire (04.06.08 14:56) [10]
    LightRipple, да можно открыть с уровнем доступа 0 Specifies device query access to the object
    (dwShareMode : FILE_SHARE_READ or FILE_SHARE_WRITE)

    , но дальнейшие обращения к DeviceIOControl для получения партиций работать не будут. Нужен именно read access, как я понял.
  • LightRipple © (04.06.08 15:29) [11]
    > [10] AllDontFire   (04.06.08 14:56)
    > LightRipple, да можно открыть с уровнем доступа 0

    Слава богу ! А то уж я (после [8] guav © ) пости распрощалась с утренним кофе :)

    По САБЖУ: Какие именно команды ты используешь в DeviceIOControl и что именно ты хочешь получить ?
    Их (этих команд) много, возможно проскочит замена одной на другую.
    И еще: read access - это слишком много (если я правильно поняла, что это за доступ),
    поиграй с различными вариантами READ_CONTROL, FILE_READ_ATTRIBUTES и т.п.
  • AllDontFire (04.06.08 21:37) [12]
    В DeviceIOControl используется команда IOCTL_DISK_GET_DRIVE_LAYOUT для получения списка партиций(лог. разделов).
    read access это GENERIC_READ.

    Если открыть хендл CreateFile через READ_CONTROL и/или  FILE_READ_ATTRIBUTES, последующий DeviceIOControl выдаст Access denied.

    Для получения "Layout" нужен FILE_READ_EA [extended file attributes], но под гостём он уже запрещён в CreateFile.
  • Игорь Шевченко © (04.06.08 22:25) [13]

    > Мне нужно определить модель жёсткого диска (HDD) или его
    > физический номер в системе как PhysicalDrive%d


    Только стоит учитывать, что одной буквой логического диска могут обозначаться несколько физических. Например, под диском с буквой С: может быть два физических устройства
  • AllDontFire (04.06.08 22:49) [14]
    Не знал что такое бывает, но в любом случае, какой-то из двух HDD будет первым, его модель можно взять за результат. А вобще интересно, как такое реализовывается, это не RAID случайно?
  • Anatoly Podgoretsky © (04.06.08 23:31) [15]
    > Игорь Шевченко  (04.06.2008 22:25:13)  [13]

    У меня под буквой С восемь дисков. Но при запуске с них программы никакой буквы нет.
  • Игорь Шевченко © (04.06.08 23:43) [16]
    AllDontFire   (04.06.08 22:49) [14]


    > Не знал что такое бывает, но в любом случае, какой-то из
    > двух HDD будет первым, его модель можно взять за результат.
    >  А вобще интересно, как такое реализовывается, это не RAID
    > случайно?


    Нет, это не RAID, разделы двух дисков смонтированы на один логический, но в разные каталоги.

    Anatoly Podgoretsky ©   (04.06.08 23:31) [15]


    > У меня под буквой С восемь дисков. Но при запуске с них
    > программы никакой буквы нет.


    У меня разделы двух дисков. Но буква есть :)
  • Anatoly Podgoretsky © (04.06.08 23:46) [17]
    > Игорь Шевченко  (04.06.2008 23:43:16)  [16]

    > Нет, это не RAID, разделы двух дисков смонтированы на один логический

    SPAN?
  • Игорь Шевченко © (04.06.08 23:51) [18]
    Anatoly Podgoretsky ©   (04.06.08 23:46) [17]

    Нет, в Disk manager примонтировал раздел одного диска в каталог диска С.

    Reparse Point
  • AllDontFire (04.06.08 23:57) [19]
    Ветвь плавно перешла в другую область :-) , хотя сам виноват, мешать не буду.

    И всё-таки сабж возможен или нет, может другие способы есть?
 
Конференция "WinAPI" » Как определить HDD программы из под гостя? [D6, WinXP]
Есть новые Нет новых   [134433   +21][b:0][p:0.001]