· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Xp&Win2000

Посл.отвђт Сообщен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