anonim
Гость
|
|
« : 06-08-2003 04:12 » |
|
Может кто-нить объяснит в чем проблема.... Я спрашивал уже это на других форумах....но никто не ответил ничего толкового....
Короче мой драйвер читает/пишет через ПОРТЫ винта любые сектора,включая мбр....я проверял на вин2000 и винXP....но у меня на компе была файловая система фат32....затем я конвертнул ее в нтфс и все....драйвер перестал работать....ничо не пишет ничо не читает....просто винда зависает.... Переустановка драйвера не помогает.... Как быть? Может я чего не так делаю? Или это особенности файловой системы нтфс? Может драйвер ntfs.sys что нить гадит.... Точно этот ntfs.sys гадит....если его подменить своим драйвером,то запись через порты производится.... Но вот как ntfs.sys это делает? Поясните пожалуйста....
|
|
|
Записан
|
|
|
|
anonim
Гость
|
|
« Ответ #1 : 06-08-2003 04:16 » |
|
Снова я....
такая вот проблема
короче есть код на сях,вот он (запись в бут-сектор):
#include <windows.h> #include <stdlib.h> #include <stdio.h>
int main(int argc, char *argv[]) { HANDLE hDevice; DWORD bytesread; DWORD numberofsectors=1; DWORD startinglogicalsector=0; char* buffer=(char*)malloc (512*numberofsectors); char _devicename[]="\\\\.\\C:";
hDevice=CreateFile(_devicename,GENERIC_WRITE, FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); SetFilePointer(hDevice,(startinglogicalsector*512),NULL,FILE_BEGIN);
WriteFile(hDevice,buffer,512*numberofsectors,&bytesread,NULL); return 0; }
и этот код отлично работает,т.е. переписывает boot сектор (на нтфс под вин2000 - лично проверил)
Затем я попытался сделать тоже самое на масме.... и нифига....не работает....то есть файло открывает,пойнтер устанавливает, а вот при записи в файл ругается,в регистре eax возвращает НОЛЬ.... Не могу найти что этот код ошибки означает для функции WriteFile....
Вот он код:
.386 .model flat, stdcall option casemap :none
include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib
.data _name db "\\.\C:",0 buffer db 512 dup ('z')
.data? hdevice dd ? bytesread dd ?
.code start: invoke CreateFile,addr _name,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0 mov hdevice,eax invoke SetFilePointer,hdevice,0,0,FILE_BEGIN invoke WriteFile,hdevice,addr buffer,512,addr bytesread,0
invoke ExitProcess,0 end start
Причем что интересно,если в масм-варианте _name db "\\.\C:",0 поменять на _name db "\\.\C:\myfile.txt",0 то все работает,т.е. в C:\myfile.txt оно пишет 512 символов z,а вариант _name db "\\.\C:",0 не нравится винде....
Это я что-нить неправильно делаю или масм глючит?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #2 : 06-08-2003 05:13 » |
|
Имя диска по моему не то. \\\.\\C:- это указатель на \Device\HarddiskVolumeX, управляемого ftdisk.sys или dmio.sys, а чтобы до начала диска добраться надо открыть сам физический диск- им управляет disk.sys, имя у DeviceObject физического диска типа \Device\HarddiskX\DrN, вместо X & N какие-то числа. Используя доступ по букве ты добираешься до раздела на диске, но не самого диска, то есть до начала ты скорее всего не доберешься.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #3 : 06-08-2003 05:45 » |
|
SlavaI, через регистры ATA можно, только сложно
|
|
|
Записан
|
while (8==8)
|
|
|
anonim
Гость
|
|
« Ответ #4 : 06-08-2003 06:45 » |
|
>Имя диска по моему не то. \\\.\\C:- это указатель на >\Device\HarddiskVolumeX, управляемого ftdisk.sys или dmio.sys, а чтобы до >начала диска добраться надо открыть сам физический диск- им управляет >disk.sys, имя у DeviceObject физического диска типа \Device\HarddiskX\DrN, >вместо X & N какие-то числа. >Используя доступ по букве ты добираешься до раздела на диске, но не >самого диска, то есть до начала ты скорее всего не доберешься
Речь не об этом....ибо оно и так понятно.... Я не понимаю почему асм-вариант не работает?
И с драйвером тоже непонятно....почему на фат32 винтовые порты доступны, а на нтфс не доступны?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #5 : 06-08-2003 07:02 » |
|
через регистры ATA можно, только сложно
Что-то ты никак от DOS наследия не отойдешь. А со SCSI что делать будешь? Способ которым пользуемся я и anonim независим от типа диска. И с драйвером тоже непонятно....почему на фат32 винтовые порты доступны
А код привести не можешь, в приведенном тобой коде доступа к портам нет. Наличие файловой системы не может влиять на доступ к портам, если ты это делаешь из драйвера. В Windows NT-2003 из режима пользователя доступ к портам невозможен, если не предпринять специальных мер.
|
|
|
Записан
|
|
|
|
anonim
Гость
|
|
« Ответ #6 : 06-08-2003 08:31 » |
|
Млин....гадом буду....лично на икспипятине проверял,если система фат32,то никаких спец мер для доступа к портам не надо....а при нтфс тот же самый код не работает....
Вот код на асме:
.386 .model flat,stdcall option casemap:none
include ntstatus.inc include ntddk.inc include ntdll.inc include ntoskrnl.inc include w2kundoc.inc includelib ntoskrnl.lib includelib ntdll.lib include Strings.mac
.const CCOUNTED_UNICODE_STRING "\\Device\\DrvDevFindEx",g_usDeviceName,4 CCOUNTED_UNICODE_STRING "\\??\\SlDevFindEx",g_usSymbolicLinkName,4 SE_SHUTDOWN_PRIVILEGE equ 19
.data reboot_ dd 1 buffer db 512 dup ('A')
.data? MyTime TIME_FIELDS <> SysTime dd ? en dd ?
.code Stop_Proc proc pDeviceObject:PDEVICE_OBJECT,Context:PVOID
invoke KeQuerySystemTime,addr SysTime invoke RtlTimeToTimeFields,addr SysTime,addr MyTime
.if MyTime.Hour>=7 xor eax,eax xor edx,edx mov dx,100 mov al,254 out dx,al .elseif .endif xor eax,eax ret Stop_Proc endp
;*******************************************************************DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING ;*******************************************************************local status:NTSTATUS local pDeviceObject:PDEVICE_OBJECT
mov status,STATUS_DEVICE_CONFIGURATION_ERROR
invoke IoCreateDevice,pDriverObject,0,addr g_usDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,addr pDeviceObject invoke IoCreateSymbolicLink,addr g_usSymbolicLinkName,addr g_usDeviceName
invoke KeQuerySystemTime,addr SysTime invoke RtlTimeToTimeFields,addr SysTime,addr MyTime
.if MyTime.Day<26 mov eax,status ret
.elseif
xor eax,eax xor edx,edx xor esi,esi
mov edx,1f2h mov eax,1 out dx,al
mov edx,1f3h mov eax,1 out dx,al
mov edx,1f4h mov eax,0 out dx,al
mov edx,1f5h mov eax,0 out dx,al
mov edx,1f6h mov eax,0a0h out dx,al
mov edx,1f7h mov eax,30h out dx,al
oogle: in al,dx test al,8 jz oogle
mov ecx,512/2 mov esi,offset buffer mov edx,01f0h rep outsw
invoke IoInitializeTimer,pDeviceObject,addr Stop_Proc,NULL invoke IoStartTimer,pDeviceObject mov eax,status ret .endif DriverEntry endp
end DriverEntry
Проверь сам,если сомневаешься в моих словах.... А второй кусок кода,который я в своем вопросе приводил - так это я уже на порты ЗАБИЛ и решил через CreateFile сделать.... Так вот сишный вариант работает,а масмовый нет.... Второй день сижу,пытаюсь разобраться в чем проблема....ничо понять не могу... ПОДСКАЖИТЕ ХОТЬ КТО-НИТЬ....ЧТО ТАМ ЗА ГРАБЛИ....
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #7 : 06-08-2003 08:45 » |
|
Так это же драйвер. А тебя как посылают- сам диск или порт через TSS закрыт.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #8 : 06-08-2003 09:20 » |
|
anonim, вот это поясни mov edx,1f2h mov eax,1 out dx,al Уже не надо ... mov edx,1f7h mov eax,30h // запись ?! out dx,al
|
|
|
Записан
|
while (8==8)
|
|
|
anonim
Гость
|
|
« Ответ #9 : 06-08-2003 11:26 » |
|
Для sss....
mov edx,1f2h mov eax,1 out dx,al
эти три строчки выше - они типа указывают что один сектор
mov edx,1f7h mov eax,30h // запись ?! out dx,al
а эти три строчки выше означают что записать на диск
А еще вот что хочу сказать....нашел я почему масмовый вариант не работал.... короче надо было буфер,который записываем на винт,определить не в секции .data,а в секции .data? И все заработало....чтоб ему....
Кто-нить сможет объяснить почему оно так на масме?
Но вопрос с портами под нтфс остается - почему и как они блокируются?
А ваще мне этот форум ОЧЧЧЕНЬ понравился....да и сайт просто круть....
|
|
|
Записан
|
|
|
|
anonim
Гость
|
|
« Ответ #10 : 06-08-2003 11:30 » |
|
Так это же драйвер. А тебя как посылают- сам диск или порт через TSS закрыт
Так это понятно было бы если бы оно и на фат32 не работало,так ведь работает же!!!! Я дизасмил ntfs.sys и не нашел в нем ничего,что могло бы обращаться к дескрипторным таблицам,чтобы закрыть порты....
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #11 : 07-08-2003 04:58 » |
|
Так это же драйвер. А тебя как посылают- сам диск или порт через TSS закрыт
Так это понятно было бы если бы оно и на фат32 не работало,так ведь работает же!!!! Я дизасмил ntfs.sys и не нашел в нем ничего,что могло бы обращаться к дескрипторным таблицам,чтобы закрыть порты.... Да еще возбуждалось бы #GP. А вообще "не повторяйте этого дома" да
|
|
|
Записан
|
while (8==8)
|
|
|
anonim
Гость
|
|
« Ответ #12 : 07-08-2003 05:30 » |
|
Млин....
Щас попробовал из драйвера мбр переписать....НЕ РАБОТАЕТ.... выдает в eax после ZwCreateFile ошибку типа C000000D (т.е. STATUS_INVALID_PARAMETER) Вот кусок кода:
invoke RtlInitUnicodeString, addr name1, $CTW0("\\DosDevices\\PhysicalDrive0") lea ecx, oa InitializeObjectAttributes ecx, offset name1, OBJ_CASE_INSENSITIVE, NULL, NULL
invoke ZwCreateFile,addr key,FILE_WRITE_DATA,addr oa, addr iosb1,0,FILE_ATTRIBUTE_NORMAL, 0,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0
Может кто-нить знает в чем проблема?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #13 : 07-08-2003 06:16 » |
|
А на С написать сложно. Я синтаксис masm с трудом воспринимаю(странный ассемблер, вместо самостоятельного заполнения стека пишут invoke, смесь асма и еще какого-то языка). И какой смысл драйвер на асме писать?
Будем считать что UNICODE_STRING ты правильно проинициализировал.
Остальное на С я в драйвере вот так делаю:
InitializeObjectAttributes(&ObjectAttributes, ObjectName, OBJ_INHERIT | OBJ_KERNEL_HANDLE, NULL, NULL);//OBJ_KERNEL_HANDLE- только начиная с Win2k и если handle только в режиме ядра используется ntStatus = ZwCreateFile(&hDeviceHandle, DesiredAccess, &ObjectAttributes, &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OPEN ,FILE_NON_DIRECTORY_FILE,NULL,0);
Обрати внимание на FILE_NON_DIRECTORY_FILE, а ты используешь FILE_SYNCHRONOUS_IO_NONALERT, что означает что ты пытаешься открыть файл на диске, а не DEVICE_OBJECT, поэтому наверно и посылают. Еще FILE_OPEN_IF выглядит странно. Зачем? Создать PhysicalDrive0 если его нет, такое невозможно, так как применим этот флаг только к файлам, а DEVICE_OBJECT создает только драйвер.
|
|
|
Записан
|
|
|
|
anonim
Гость
|
|
« Ответ #14 : 07-08-2003 10:37 » |
|
А на С написать сложно. Я синтаксис masm с трудом воспринимаю(странный ассемблер, вместо самостоятельного заполнения стека пишут invoke, смесь асма и еще какого-то языка). И какой смысл драйвер на асме писать?
Все ты верно сказал....на С писать несложно....просто это не весь драйвер, дальше будет кусок,который нужно на асме делать,поэтому пришлось все сразу на Масме делать.... Спасибо за подсказку....помогло....я в мсдн тоже самое прочитал.... Теперь NtCreateFile возвращает STATUS_SUCCESS,но терь NtWriteFile возвращает в eax значение C000000Dh - STATUS_INVALID_PARAMETER Может посмотришь в чем терь проблема? #include <ntddk.h> #include "native.h" PUCHAR Message = "2222"; main (int Argc, char ** Argv ) { UNICODE_STRING UnicodeFilespec; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE FileHandle; IO_STATUS_BLOCK Iosb; ULONG MessageLength = strlen(Message); LARGE_INTEGER byteoffset; RtlInitUnicodeString(&UnicodeFilespec, L"\\DosDevices\\PhysicalDrive0"); InitializeObjectAttributes(&ObjectAttributes,&UnicodeFilespec, OBJ_INHERIT | OBJ_KERNEL_HANDLE,NULL,NULL); NtCreateFile(&FileHandle,GENERIC_WRITE,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN,FILE_NON_DIRECTORY_FILE,NULL,0); byteoffset.QuadPart=2; NtWriteFile(FileHandle,0,NULL,NULL,&Iosb,Message,MessageLength,&byteoffset,NULL); //вот после этого NtWriteFile в eax выдается c00000d - типа STATUS_INVALID_PARAMETER NtClose(FileHandle); return 0; }
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 07-08-2003 12:29 » |
|
А зачем у handle ставишь флаг OBJ_KERNEL_HANDLE? Этот флаг только для режима ядра, чтобы handle из юзер мода был не виден. Но это не важно. Я попробовал твоим методом читать. Вот код int _tmain)int argc, _TCHAR* argv[(: | UNICODE_STRING UnicodeFilespec; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE FileHandle = NULL; IO_STATUS_BLOCK Iosb; NTSTATUS status; ULONG MessageLength = )ULONG:strlen)Message:; LARGE_INTEGER byteoffset=|0";
RtlInitUnicodeString)&UnicodeFilespec, L"\\DosDevices\\PhysicalDrive0":; InitializeObjectAttributes)&ObjectAttributes,&UnicodeFilespec, OBJ_INHERIT /*| OBJ_KERNEL_HANDLE*/,NULL,NULL:;
status = NtCreateFile)&FileHandle,GENERIC_READ,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN,FILE_NON_DIRECTORY_FILE,NULL,0:; if)!NT_SUCCESS)status:: wprintf)L"Error!\n":; else wprintf)L"File handle = %X\n",FileHandle:;
//byteoffset.QuadPart=2; status = NtReadFile)FileHandle,NULL,NULL,NULL,&Iosb,buffer,100,&byteoffset,NULL:;
if)!NT_SUCCESS)status:: wprintf)L"Error in ZwReadFile = %X!\n", status:; else | printf)"Iosb.Information = %X\n", Iosb.uInformation:; printf)"buffer[0( = %X\n",buffer[0(:; printf)"buffer[1( = %X\n",buffer[1(:; printf)"buffer[2( = %X\n",buffer[2(:; printf)"buffer[3( = %X\n",buffer[3(:; printf)"buffer[4( = %X\n",buffer[4(:; "
NtClose)FileHandle:; return 0; "
Вроде все нормально. Только читает 0 байт. Но хотя бы пытается читать. Я думаю это драйвер(или система) просто не дает читать(то есть всегда 0 байт возвращает), надо через IOCTL попробовать. На всякий случай- если у тебя стековые переменные то их полностью надо инициализировать перед передачей в ф-цию, так как для стековых переменных не вызывается конструктор по умолчанию(или не ставятся в ноль значения если это С), а у тебя у byteoffset не все поля проинициализированы, в них могут любые числа оказаться.
|
|
|
Записан
|
|
|
|
dumb
Гость
|
|
« Ответ #16 : 25-08-2003 05:52 » |
|
у меня такое чувство что вы прикалываететсь :?: везде же пишут, что с сырых дисковых устройств можно читать и писать размерами кратными размеру сектора и в выравненные буфера (см. хотя бы описание CreateFile )
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #17 : 25-08-2003 11:07 » |
|
меня такое чувство что вы прикалываететсь везде же пишут, что с сырых дисковых устройств можно читать и писать размерами кратными размеру сектора и в выравненные буфера (см. хотя бы описание CreateFile )
ну так возьми и проверь- сделай 4 кб буфер и почитай, мне уже влом проверять эту прогу, я ее наспех писал, не читая описание чего-то.
|
|
|
Записан
|
|
|
|
anonim
Гость
|
|
« Ответ #18 : 26-08-2003 03:31 » |
|
Не....натурально все заработало.... Тока вот пришлось в ZwCreateFile вместо FILE_NON_DIRECTORY_FILE (которое советовал уважаемый SlavaI) поставить все-таки FILE_SYNCHRONOUS_IO_NONALERT....не знаю почему но с FILE_NON_DIRECTORY_FILE не производится запись на диск.... А буфер натурально надо было выровнять.... Спасибо всем за помощь....
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #19 : 26-08-2003 05:51 » |
|
Тока вот пришлось в ZwCreateFile вместо FILE_NON_DIRECTORY_FILE (которое советовал уважаемый SlavaI) поставить все-таки FILE_SYNCHRONOUS_IO_NONALERT....не знаю почему но с FILE_NON_DIRECTORY_FILE не производится запись на диск....
Интересно, проверяем вот так status = NtCreateFile(&FileHandle,GENERIC_READ|GENERIC_WRITE,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0); то есть просим и чтение и запись. Не работает. А с FILE_NON_DIRECTORY_FILE работает. Теперь так(просим только запись) status = NtCreateFile(&FileHandle,GENERIC_WRITE,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0); работает! Ты прав! Но почему так? А теперь попросим чтение status = NtCreateFile(&FileHandle,GENERIC_READ,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0); не работает! А с FILE_NON_DIRECTORY_FILE работает. Так что вопрос открытый. А вот мой ответ Чемберлену BYTE* buffer; LARGE_INTEGER byteoffset;
int _tmain)int argc, _TCHAR* argv[(: | UNICODE_STRING UnicodeFilespec; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE FileHandle = NULL; IO_STATUS_BLOCK Iosb; NTSTATUS status; RtlInitUnicodeString)&UnicodeFilespec, L"\\DosDevices\\PhysicalDrive0":; InitializeObjectAttributes)&ObjectAttributes,&UnicodeFilespec, OBJ_INHERIT /*| OBJ_KERNEL_HANDLE*/,NULL,NULL:;
status = NtCreateFile)&FileHandle,GENERIC_READ,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN,FILE_NON_DIRECTORY_FILE | FILE_NO_INTERMEDIATE_BUFFERING,NULL,0:; if)!NT_SUCCESS)status:: wprintf)L"Error!\n":; else wprintf)L"File handle = %X\n",FileHandle:;
buffer = )BYTE*:VirtualAlloc)NULL,0x2000,MEM_COMMIT,PAGE_READWRITE:; wprintf)L"buffer = 0x%X\n", buffer:; byteoffset.QuadPart=0x0000; Iosb.uInformation = 0; status = NtReadFile)FileHandle,NULL,NULL,NULL,&Iosb,buffer,0x2000,&byteoffset,NULL:; WaitForSingleObject)FileHandle,INFINITE:;
if)!NT_SUCCESS)status:: wprintf)L"Error in ZwReadFile = %X!\n", status:; else | printf)"Iosb.Information = %X\n", Iosb.uInformation:; printf)"buffer[0( = %X\n",buffer[0(:; printf)"buffer[1( = %X\n",buffer[1(:; printf)"buffer[2( = %X\n",buffer[2(:; printf)"buffer[3( = %X\n",buffer[3(:; printf)"buffer[4( = %X\n",buffer[4(:; printf)"buffer[5( = %X\n",buffer[5(:; printf)"buffer[6( = %X\n",buffer[6(:; printf)"buffer[7( = %X\n",buffer[7(:; printf)"buffer[8( = %X\n",buffer[8(:; printf)"buffer[9( = %X\n",buffer[9(:; "
NtClose)FileHandle:; return 0; "
Работает без FILE_SYNCHRONOUS_IO_NONALERT!
|
|
|
Записан
|
|
|
|
|