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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: KeServiceDescriptorTable  (Прочитано 19128 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nike_zp
Гость
« : 09-12-2003 12:18 » 

Как узнать значение переменной KeServiceDescriptorTable,  которая экспортируется из микроядра ntoskrnl.exe
Записан
point
Гость
« Ответ #1 : 09-12-2003 14:59 » 

что значит "как узнать"? это указатель на недокументированную структуру.

LPSSDT        lpSSDT = (LPSSDT) KeServiceDescriptorTable;

кое-что можно почитать здесь:
http://www.cmkrnl.com/arc-newint2e.html
http://he4dev.e1.bmstu.ru/HookSysCall/

point.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 10-12-2003 21:56 » 

Цитата

Как узнать значение переменной KeServiceDescriptorTable


Если переменная экспортируется- то напиши ее имя и все.
ULONG ptr=KeServiceDescriptorTable;
и заранее объяви ее, если не объявлена
extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;

Цитата

микроядра ntoskrnl.exe


Начиная с Windows NT 4.0 нельзя называть систему микроядерной, ядро монолитное с возможностью динамического подключения драйверов и модулей.
Записан
point
Гость
« Ответ #3 : 11-12-2003 07:03 » 

Цитата

Начиная с Windows NT 4.0 нельзя называть систему микроядерной, ядро монолитное с возможностью динамического подключения драйверов и модулей.


на мой взгляд это достаточно странное утверждение... на сколько я понимаю ядро 3.x отличается от 4-го тем что в 4-м в ядро добавились GUI сервисы - как это могло повлиять на "микроядерность"?

point.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 11-12-2003 20:30 » 

Цитата

на мой взгляд это достаточно странное утверждение... на сколько я понимаю ядро 3.x отличается от 4-го тем что в 4-м в ядро добавились GUI сервисы - как это могло повлиять на "микроядерность"?


 До NT 4 графическая подсистема жила в отдельном процессе, что позволяло говорить о некоторых признаках микроядерности, начиная с 4 версии графическая подсистема стала обыкновенным драйвером. Вот так и повлияло- не микроядерная система- это бесспорно, такое же мнение имеют D. Solomon и M. Russinovich, с ним можно ознакомится в книге "Windows 2000 Internals". Ядро не микроядерное- нет ни одного признака микроядерности. Все драйвера, даже видеоподсистемы, находятся в одном адресном пространстве. Крах одного драйвера означает крах системы. Код всех драйверов отображается на адресное пространство всех процессов.
  Микроядерная система грузит большую часть драйверов в отдельные процессы, именно поэтому она и называется микроядерная, как пример Windows CE имеет несколько процессов- один на ядро nk.exe, второй для загрузки драйверов, третий для видеоподсистемы и устройств ввода, четвертый для драйверов файловой системы. Для обращения к драйверам необходимо переключение процессов, причем при желании можно не запускать например процесс графической подсистемы, если он не нужен.
Или посмотри на ядро Mach.
Записан
point
Гость
« Ответ #5 : 12-12-2003 08:36 » 

на счет "нет ни одного признака микроядерности", вопрос спорный, однако называть ядро NT исключительно монолитным я бы не стал. признаки "микроядерности" все же присутствуют. готов согласится в том это ядро не является чисто "микроядерным", это скорее помесь монолитного ядра с микроядерным.

point.
Записан
nike
Гость
« Ответ #6 : 16-12-2003 13:37 » 

В структуре, на которую указывает эта переменная, есть поле - массив, который содержит адреса сервисов. Так вот, вопрос в том как, например, узнать значение этого массива с индексом 20 (NtCreateFile). Я обращаюсь, как к обычному массиву(типа addr=mas[20]Ага, но выводится ошибка, что размер этого массива неизвестен.

P.S. Я основываюсь на статье http://he4dev.e1.bmstu.ru/HookSysCall/
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 16-12-2003 14:49 » 

Цитата

 структуре, на которую указывает эта переменная, есть поле - массив, который содержит адреса сервисов. Так вот, вопрос в том как, например, узнать значение этого массива с индексом 20 (NtCreateFile). Я обращаюсь, как к обычному массиву(типа addr=mas[20], но выводится ошибка, что размер этого массива неизвестен.



Странно. Это же обыкновенный С.

Это наверно из-за
typedef void* SSTAT[];
у массива неизвестный размер, переопредели как
typedef void** SSTAT;
или
typedef void* SSTAT; в зависимости от того что понимаешь под этим.
Записан
Yura
Гость
« Ответ #8 : 23-12-2003 22:29 » 

Народ А существут ли функция INT2Eh  чтения/записи в физические
сектора жёсткого диска? А то я чёта такой API-функции не помню
и соответственно не могу применить методику изложеную в: http://he4dev.e1.bmstu.ru
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 24-12-2003 06:09 » 

Цитата

А существут ли функция INT2Eh чтения/записи в физические
сектора жёсткого диска?


NtReadFile/ NtWriteFile для объекта \Device\HarddiskN\DRN (или \Device\HarddiskN\Partition0 в <=NT 4), где N - номер физического диска.
Записан
point
Гость
« Ответ #10 : 24-12-2003 13:33 » 

Цитата

А то я чёта такой API-функции не помню
и соответственно не могу применить методику изложеную в: http://he4dev.e1.bmstu.ru


а что за метод описанный у he4 требует чтения физ. секторов hdd?

point.
Записан
Yura
Гость
« Ответ #11 : 24-12-2003 14:43 » 

Цитата: SlavaI

NtReadFile/ NtWriteFile для объекта \Device\HarddiskN\DRN (или \Device\HarddiskN\Partition0 в <=NT 4), где N - номер физического диска.

Спасибо это уже что-то.
Я так понял что для записи в в любое устройство (COMпорт, файл, физический
сектор) используется один и тот же системный сервис
mov ax,const1
int    2Eh
связаный с API функциями NtReadFile/ NtWriteFile
Цитата: point

а что за метод описанный у he4 требует чтения физ. секторов hdd?

Нет там изложен метод получения через функции API номера функции (или функций) прерывания INT 2Eh. (в рамках более общей задачи)
Методы описаные в he4 не требуют чтения физ. секторов hdd
просто у меня есть идея к которой я иду медленно но упорно.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 24-12-2003 14:56 » 

Цитата

Я так понял что для записи в в любое устройство (COMпорт, файл, физический
сектор) используется один и тот же системный сервис
mov ax,const1
int 2Eh
связаный с API функциями NtReadFile/ NtWriteFile


Правильно понял. А связано это с тем, что почти у всех драйверов для записи на то чем они управляют используется один код- IRP_MJ_WRITE, который и делает NtWriteFile. Иногда используют RP_MJ_DEVICE_CONTROL, но это уже реже.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #13 : 24-12-2003 14:58 » 

Кстати- тема чтения с диска обсуждалось на этих форумах, только не помню где, там даже примеры кода были приведены.
Записан
Yura
Гость
« Ответ #14 : 24-12-2003 15:47 » 

to SlavaI

Спасибо за подробный коментарий но вопрос для меня так и остался
открытым:
Не найдуться ли вдруг обходные пути по которым какая-нибудь
специфичная APIфункция, не имеющая прямого отношения к чтению\записи на диск,
через другой системный сервис читает\пишет на диск в обход KeWriteFile/KReadFile.
Если это так то где надо поставить заплатку чтобы контролировать этот процесс. Если есть необходимость делать заплатку в виде драйвера
фильтра то интересно знать между какими драйверами её надо ставить и каков пртокол взаимодействия с драйвером более низкого уровня?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #15 : 26-12-2003 14:02 » 

Вот по диску у себя порылся и нашел код из обсуждения про прямое чтение с диска
Код:

#include <windows.h>

extern "C"
|
#include "NTDLL.h"
"
#define OBJ_KERNEL_HANDLE       0x00000200L

//#include "native.h"

#define BUFF_SIZE 0x2000

BYTE*  buffer;//[512(;
LARGE_INTEGER byteoffset;

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:;

   RtlInitUnicodeString)&UnicodeFilespec, L"\\Device\\Harddisk0\\DR0":;
   InitializeObjectAttributes)&ObjectAttributes,&UnicodeFilespec,
      OBJ_INHERIT /*| OBJ_KERNEL_HANDLE*/,NULL,NULL:;

   status = NtCreateFile)&FileHandle,GENERIC_READ,&ObjectAttributes,&Iosb,0,
      FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ | FILE_SHARE_WRITE ,
      FILE_OPEN,FILE_NON_DIRECTORY_FILE | FILE_NO_INTERMEDIATE_BUFFERING,NULL,0:;
   if)!NT_SUCCESS)status::
      wprintf)L"Error! In NtCreateFile, Error=0x%X \n",status:;
   else
      wprintf)L"File handle = %X\n",FileHandle:;

   buffer = )BYTE*:VirtualAlloc)NULL,BUFF_SIZE,MEM_COMMIT,PAGE_READWRITE:;
   wprintf)L"buffer = 0x%X\n", buffer:;
   memset)buffer,0x0,BUFF_SIZE:;
   
   byteoffset.QuadPart=0x0000;
   Iosb.uInformation = 0;
   status = NtReadFile)FileHandle,NULL,NULL,NULL,&Iosb,buffer,BUFF_SIZE,&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;
"

Записан
Yura
Гость
« Ответ #16 : 01-01-2004 20:03 » 

Спасибо за пример.
Надеюсь мои опасения напрасны о обходного пути записи/чтения на диск не существует (в рамках стандартной поставки О.С.)
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #17 : 12-01-2004 06:24 » new

Цитата

Надеюсь мои опасения напрасны о обходного пути записи/чтения на диск не существует (в рамках стандартной поставки О.С.)


По моему нет. Выбор у приложений такой- или Nt(Zw)Read/WriteFile или Nt(Zw)DeviceIoControlFile.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines