Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ntfs и fat32  (Прочитано 23483 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
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
Главный специалист

ru
Offline Offline

« Ответ #2 : 06-08-2003 05:13 » 

Имя диска по моему не то. \\\.\\C:- это указатель на \Device\HarddiskVolumeX, управляемого ftdisk.sys или dmio.sys, а чтобы до начала диска добраться надо открыть сам физический диск- им управляет disk.sys, имя у DeviceObject физического диска типа \Device\HarddiskX\DrN, вместо X & N какие-то числа.
 Используя доступ по букве ты добираешься до раздела на диске, но не самого диска, то есть до начала ты скорее всего не доберешься.
Записан
sss
Специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline Offline

« Ответ #7 : 06-08-2003 08:45 » 

Так это же драйвер. А тебя как посылают- сам диск или порт через TSS закрыт.
Записан
sss
Специалист

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #11 : 07-08-2003 04:58 » 

Цитата: anonim
Так это же драйвер. А тебя как посылают- сам диск или порт через 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline Offline

« Ответ #17 : 25-08-2003 11:07 » 

Цитата

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


ну так возьми и проверь- сделай 4 кб буфер и почитай, мне уже влом проверять эту прогу, я ее наспех писал, не читая описание чего-то.
Записан
anonim
Гость
« Ответ #18 : 26-08-2003 03:31 » new

Не....натурально все заработало....
Тока вот пришлось в ZwCreateFile вместо FILE_NON_DIRECTORY_FILE (которое советовал уважаемый SlavaI) поставить все-таки FILE_SYNCHRONOUS_IO_NONALERT....не знаю почему но с FILE_NON_DIRECTORY_FILE не производится запись на диск....
А буфер натурально надо было выровнять....
Спасибо всем за помощь....
Записан
SlavaI
Главный специалист

ru
Offline 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!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines