|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 26, 2003 00:28:03 Уважаемые, подскажите в какую сторону растекаться мыслью: драйвер (читает master boot record) выбивает 100% win2000, сегодня положил таким образом три машины, две вылетают в BSOD, третья грузит System до посинения. На winXP все в порядке, проверялось на Xp с установленным SP1 и без оного. Недокументированные функции не использовал. |
|
|
Дата: Окт 26, 2003 01:52:14 При том обилии(!) информации, что ты указал, предлагаю поплясать с бубном! |
|
|
Дата: Окт 26, 2003 14:44:38 Хе-хе. Злые вы, но справедливые;) В общем-то, я предложил эту тему не только из-за поставленной передо мной задачи. Мне в первую очередь хотелось бы узнать конкретные различия в ядре между этими операционками, услышать мнения тех, кто сталкивался с подобной несовместимостью и найденные решения. Дабы в будущем не наступать на грабли. Что касается алгоритма моей программы: приложение запускает службу; процедура из драйвера читает сектор непосредственно через порты контроллера НЖМД; полученные 512 байт сохраняются на диске(ZwCreateFile, ZwWriteFile); возвращается STATUS_DEVICE_CONFIGURATION_ERROR. |
|
|
Дата: Окт 26, 2003 20:07:52 Лучше бы Four-F что-то сказал... конкретные различия в ядре - ни хрена себе вопрос! Я полагаю, тебе и Руссинович с Соломоном ответа не дадут! Что касается алгоритма моей программы - ну, выглядит безобидно, разве что читаешь ты уж очень круто. Nt-функции - я понимаю, а через I/O-читать... Иначе нельзя? Через API? |
|
|
Дата: Окт 27, 2003 00:15:54 А что есть API-функции абсолютного чтения диска? Подскажи если нетрудно. Вообще в данном случае мне интересен процесс, а не результат. Да и к тому же: "нормальные герои всегда идут в обход" ;). Именно в процедуре чтения сектора ошибки нет(уверен на 90%). К сожалению сразу поленился взять дампы с машин win2000, а теперь нет такой возможности. И еще деталь: управление приложению пользователя не возвращалось во все случаях с NT 5.0 (хотя это наверно и так понятно). |
|
|
Дата: Окт 27, 2003 10:24:50 · Поправил: Four-F Вообще то MBR спокойно читается через апи. Даже из юзера наверное должно работать. Если именно через порты надо, то где-то тут http://freehafer.tripod.com лежала прога, которая это делала - у меня под 2000 работала без проблем. ;@echo off
;goto make
.386
.model flat, stdcall
option casemap:none
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
include \masm32\include\w2k\ntstatus.inc
include \masm32\include\w2k\ntddk.inc
include \masm32\include\w2k\ntoskrnl.inc
includelib \masm32\lib\w2k\ntoskrnl.lib
include \masm32\Macros\Strings.mac
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
FILE_ALIGNMENT_INFORMATION STRUCT ; Information Class 17
AlignmentRequirement DWORD ?
FILE_ALIGNMENT_INFORMATION ENDS
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
.const
CCOUNTED_UNICODE_STRING "\\DosDevices\\PhysicalDrive0", g_usPhysicalDrive, 4
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
.code
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
local status:NTSTATUS
local oa:OBJECT_ATTRIBUTES
local hFile:HANDLE
local Status:NTSTATUS
local iosb:IO_STATUS_BLOCK
local dwAlignment:DWORD
local misalignment:BYTE
local buffer[1024]:BYTE
mov status, STATUS_DEVICE_CONFIGURATION_ERROR
lea ecx, oa
InitializeObjectAttributes ecx, offset g_usPhysicalDrive, OBJ_CASE_INSENSITIVE, NULL, NULL
invoke ZwCreateFile, addr hFile, FILE_READ_DATA + SYNCHRONIZE, addr oa, addr iosb, \
0, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0
.if eax == STATUS_SUCCESS
invoke ZwQueryInformationFile, hFile, addr iosb, addr dwAlignment, \
sizeof FILE_ALIGNMENT_INFORMATION, FileAlignmentInformation
lea ecx, buffer
mov eax, dwAlignment
add ecx, eax
inc ecx ; + (FILE_XXX_ALIGNMENT + 1)
not eax
and ecx, eax ; ~ FILE_XXX_ALIGNMENT
push ecx
invoke ZwReadFile, hFile, 0, NULL, NULL, addr iosb, ecx, 512, 0, NULL
pop ecx
.if ( eax == STATUS_SUCCESS ) && ( iosb.Status == STATUS_SUCCESS ) && ( iosb.Information == 512 )
; ecx -> MBR Data
invoke DbgPrint, $CTA0("MBR read successfully\n")
.endif
invoke ZwClose, hFile
.endif
mov eax, status
ret
DriverEntry endp
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
end DriverEntry
:make
\masm32\bin\ml /nologo /c /coff ReadMBR.bat
\masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:ReadMBR.sys /ignore:4078 /subsystem:native ReadMBR.obj
del ReadMBR.obj
echo.
pause
Для компиляции бери KmdKit (лежит на сайте). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.035 |