Сейчас на форуме: Rio, tyns777, zombi-vadim (+6 невидимых)

 eXeL@B —› Программирование —› Windows7: WriteFile access denied только на дальних секторах. Помогите разобраться.
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 февраля 2015 16:00 · Поправил: ToBad
· Личное сообщение · #1

Здравствуйте!
Есть код записи сектора на PhysicalDrive0 который при записи на дальние сектора выдаёт "access denied" на некоторых Windows 7 машинах.
Запуск от админа, в режиме эмуляции windows XP, с разными состояниями UAC, с FSCTL_DISMOUNT_VOLUME и FSCTL_LOCK_VOLUME я пробовал. Даже политики копировал с компа где всё работает - ничего не помогло.
Ставлю CPConverted.QuadPart:=$6800; - всё работает (читаю и пишу), ставлю в конец диска например (где предварительно записал что-то через WinHex) - работает только чтение!

Code:
  1. const
  2.   FILE_DEVICE_CONTROLLER = $00000004;
  3.   FILE_DEVICE_FILE_SYSTEM = $00000009;
  4.   FILE_DEVICE_MASS_STORAGE = $0000002D;
  5.  
  6.   METHOD_BUFFERED = $00000000;
  7.   FILE_ANY_ACCESS = $00000000;
  8.   FILE_READ_ACCESS = $00000001;
  9.   FILE_WRITE_ACCESS = $00000002;
  10.  
  11.   IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
  12.   IOCTL_SCSI_BASE = FILE_DEVICE_CONTROLLER;
  13.  
  14.   FSCTL_LOCK_VOLUME = (FILE_DEVICE_FILE_SYSTEM shl 16) or
  15.     (FILE_ANY_ACCESS shl 14) or ($6 shl 2) or METHOD_BUFFERED;
  16.  
  17.   FSCTL_DISMOUNT_VOLUME = (FILE_DEVICE_FILE_SYSTEM shl 16) or
  18.     (FILE_ANY_ACCESS shl 14) or ($8 shl 2) or METHOD_BUFFERED;
  19.  
  20. var
  21.   CPConverted: LARGE_INTEGER;
  22.   hDiskFile: thandle;
  23.   intreadedamount,BytesWritten: cardinal;
  24.   buf2: array of byte;
  25. begin
  26.   CPConverted.QuadPart:=$6800;
  27.   hDiskFile:=CreateFile('\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  28.   SetFilePointer(hDiskFile, Longint(CPConverted.LowPart), @CPConverted.HighPart, FILE_BEGIN);
  29.  
  30.   //if not DeviceIoControl(hDiskFile,FSCTL_DISMOUNT_VOLUME, nil, 0, nil, 0, BytesWritten, nil) then Log('DeviceIoControl (FSCTL_DISMOUNT_VOLUME) Error: ' + SysErrorMessage(GetLastError));
  31.   //if not DeviceIoControl(hDiskFile,FSCTL_LOCK_VOLUME, nil, 0, nil, 0, BytesWritten, nil) then Log('DeviceIoControl (FSCTL_LOCK_VOLUME) Error: ' + SysErrorMessage(GetLastError));
  32.  
  33.   SetLength(buf2,512);
  34.   fillchar(buf2[0],512,#0);
  35.   buf2[1]:=$14;
  36.   WriteFile(hDiskFile,buf2[0], length(buf2), BytesWritten, nil);
  37.   log(SysErrorMessage(GetLastError));
  38.  
  39.   fillchar(buf2[0],512,#0);
  40.   SetFilePointer(hDiskFile, Longint(CPConverted.LowPart), @CPConverted.HighPart, FILE_BEGIN);
  41.   ReadFile(hDiskFile,buf2[0], length(buf2), intreadedamount, nil);
  42.  
  43.   CloseHandle(hDiskFile);
  44.   Finalize(buf2);
  45. end.




Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

Создано: 20 февраля 2015 16:58
· Личное сообщение · #2

А теперь вопрос.Зачем ? Зачем лезть на дальние сектора ? Товарищ извращенец, не иначе.

-----
TEST YOUR MIGHT





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 февраля 2015 17:11
· Личное сообщение · #3

NTFS?
а вообще принято читать коды ошибок, а не фантазировать пишет не пишет, прям как на ромашках




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 февраля 2015 17:42 · Поправил: ToBad
· Личное сообщение · #4

unknownproject пишет:
А теперь вопрос.Зачем ? Зачем лезть на дальние сектора ? Товарищ извращенец, не иначе.


Точно, зачем лезть на дальние когда есть ближние! Прочитал ваш информативный пост и переосмыслил всю свою жизнь, простите, что не оправдал ваших надежд.
p.s. И хорошо, что вы добавили смайлики, без них ценность вашего ответа была бы на порядок ниже.

reversecode пишет:
NTFS?
а вообще принято читать коды ошибок, а не фантазировать пишет не пишет, прям как на ромашках


Да, NTFS. В смысле не SysErrorMessage(GetLastError), а именно код возвращаемый GetLastError?
Насчёт NTFS разве есть разница, ведь я к PhysicalDrive0 обращаюсь, вот например смещение $6800 это сектор $34, даже в диск C: не попадает на котором NTFS...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 февраля 2015 18:12
· Личное сообщение · #5

ToBad пишет:
SysErrorMessage(GetLastError), а именно код возвращаемый GetLastError?

ну давай и ту и ту, посмотри как ее винда отмапила в строку



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 20 февраля 2015 18:14 · Поправил: vden
· Личное сообщение · #6

Может выравнивание смещения должно быть например на 512 или 4096 или по размеру блока фс. Еще может быть нужно читать/писать блок целиком.
А вообще конечно по коду ошибки нужно гуглить.

GetFileSize кстати может не работать для хэндла диска, тогда размер нужно считать по характеристикам диска.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 февраля 2015 18:15
· Личное сообщение · #7

скорее всего смещение не выровняно

Добавлено спустя 12 минут
для общего познания всевозможные проблемы рассмотрены --> Link <--




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 февраля 2015 19:03
· Личное сообщение · #8

vden пишет:
Может выравнивание смещения должно быть например на 512 или 4096 или по размеру блока фс. Еще может быть нужно читать/писать блок целиком.


Да, конечно, и то и то верно. Смещение кратно 512, читаю и пишу полностью 512 байт, без этого и на ХП проблемы.... Ещё с WinHex проверяю что-бы начало сектора, ну и вычитывается без проблем (то есть SetFilePointer указывает куда нужно)...

Добавлено спустя 23 минуты
reversecode пишет:
для общего познания всевозможные проблемы рассмотрены --> Link <--


Почитал, попробую с буфером 1024 и 4096...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 февраля 2015 20:20
· Личное сообщение · #9

так что говорит гет ласт еррор?




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 февраля 2015 21:14
· Личное сообщение · #10

reversecode пишет:
так что говорит гет ласт еррор?


Я через teamviewer тестирую, жду когда комп включат...

Добавлено спустя 4 часа 36 минут
Ошибка 5, доступ запрещён. В общем чуть изменил код и с определённым шагом в секторах читал и писал сектор. Таким способом удалось узнать с какого сектора возникает ошибка. В общем от 0 до 32788728 пишет без проблем, от 32788729 и до конца диска - ошибка...

Code:
  1. Sector: 32788728, Addr: $3E8A1F000 (16787828736), Read: 512, Writen: 512, Result: OK ($00000000)
  2. Sector: 32788729, Addr: $3E8A1F200 (16787829248), Read: 512, Writen: 0, Result: Access denied ($00000005)
  3.  
  4. Вот диск по версии WinHex:
  5. Имя, тип, размер, стартовый сектор
  6. Start sectors, 1.0 MB, 0   
  7. Partition 1, NTFS, 15.6 GB, 2048    
  8. Unpartitioned space, 2.1 MB, 32784377        
  9. Partition 2 (C:), NTFS, 170 GB,     32788728     
  10. Unpartitioned space, 2.6 MB, 388274985       
  11. Partition 3, NTFS, 281 GB, 388280320         
  12. Unpartitionable space, 24.0 KB, 976773120


Таким образом получается, что хотя и открываю PhysicalDrive0, писать могу только до начала диска С и его первый сектор, но не дальше... Почему так?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 21 февраля 2015 09:37
· Личное сообщение · #11

ToBad может винда блочит системный диск? надо посмотреть чем винхекс пишет сектора, возможно ядерными функами или через свой драйвер

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 33.4 (посетитель), 24thx
Активность: 0.020
Статус: Участник

Создано: 21 февраля 2015 12:09 · Поправил: redlord
· Личное сообщение · #12

ToBad
http://support.microsoft.com/kb/942448/en-us
https://msdn.microsoft.com/en-us/library/windows/hardware/ff551353(v=vs.85).aspx

сектора, где лежит pagefile, должны лочиться на запись.
http://stoned-vienna.com/html/page=pagefile-attack




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 21 февраля 2015 14:29
· Личное сообщение · #13

Я согласен, что может блочить доступ с дискам\занятым секторам, но во первых на других компах с Win7 этого не происходит (нативирусов\фаерволов - нет), а во вторых писать получается сюда:
Code:
  1. Start sectors, 1.0 MB, 0   
  2. Partition 1, NTFS, 15.6 GB, 2048    
  3. Unpartitioned space, 2.1 MB, 32784377

А сюда уже нет:
Code:
  1. Partition 2 (C:), NTFS, 170 GB,     32788728     
  2. Unpartitioned space, 2.6 MB, 388274985       
  3. Partition 3, NTFS, 281 GB, 388280320         
  4. Unpartitionable space, 24.0 KB, 976773120

Давайте забудем о диске С с его пейджфайлами, грубо говоря в Partition 1 писать можно, а в Partition 2 и Partition 3, а так же Unpartitionable space идущем за ним уже нет!



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 21 февраля 2015 14:29
· Личное сообщение · #14

Господи.

Прямая запись на неразмонтированный диск (еще и системный) это мягко говоря плохая идея и типичный быдлокодинг уровня виндоус хп. Менеджер разделов вам очень обрадуется.

Что можно порекомендовать в этой ситуации? Первое - не заниматься подобной херней. Второе если уж хочется то придется это делать через SPTI интерфейсы, как это и делает винхекс. Дрова какие-то тут уже насочиняли и прочий бред.

Берем и делаем STPD запрос через DeviceIoControl на устройства диска, все, победа.
https://msdn.microsoft.com/en-us/library/windows/hardware/ff565346%28v=vs.85%29.aspx




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 февраля 2015 22:41
· Личное сообщение · #15

Alchemistry Я понимаю, что быдлокодинг, но хотелось понять почему на одной win7 код работает, на другой - нет. Кстати, на той машине после переустановки win7 всё стало работать как нужно...


 eXeL@B —› Программирование —› Windows7: WriteFile access denied только на дальних секторах. Помогите разобраться.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати