| 
			| 
					
						| nike_zp 
								Гость
 | 
								|  | «  : 09-12-2003 12:18 »  |  | 
 
 Как узнать значение переменной KeServiceDescriptorTable,  которая экспортируется из микроядра ntoskrnl.exe |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    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 
								Главный специалист    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 
								Главный специалист    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 
								Главный специалист    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 »  |  | 
 
 а что за метод описанный у he4 требует чтения физ. секторов hdd? point. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Yura 
								Гость
 | 
								|  | « Ответ #11 : 24-12-2003 14:43 »  |  | 
 
 NtReadFile/ NtWriteFile для объекта \Device\HarddiskN\DRN (или \Device\HarddiskN\Partition0 в <=NT 4), где N - номер физического диска.
 
 Спасибо это уже что-то. Я так понял что для записи в в любое устройство (COMпорт, файл, физический  сектор) используется один и тот же системный сервис  mov ax,const1 int    2Eh связаный с API функциями NtReadFile/ NtWriteFile  а что за метод описанный у he4 требует чтения физ. секторов hdd?
 
 Нет там изложен метод получения через функции API номера функции (или функций) прерывания INT 2Eh. (в рамках более общей задачи) Методы описаные в he4 не требуют чтения физ. секторов hdd  просто у меня есть идея к которой я иду медленно но упорно. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    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 
								Главный специалист    Offline | 
								|  | « Ответ #13 : 24-12-2003 14:58 »  |  | 
 
 Кстати- тема чтения с диска обсуждалось на этих форумах, только не помню где, там даже примеры кода были приведены. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Yura 
								Гость
 | 
								|  | « Ответ #14 : 24-12-2003 15:47 »  |  | 
 
 to SlavaI
 Спасибо за подробный коментарий но вопрос для меня так и остался
 открытым:
 Не найдуться ли вдруг обходные пути по которым какая-нибудь
 специфичная APIфункция, не имеющая прямого отношения к чтению\записи на диск,
 через другой системный сервис читает\пишет на диск в обход KeWriteFile/KReadFile.
 Если это так то где надо поставить заплатку чтобы контролировать этот процесс. Если есть необходимость делать заплатку в виде драйвера
 фильтра то интересно знать между какими драйверами её надо ставить и каков пртокол взаимодействия с драйвером более низкого уровня?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    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 
								Главный специалист    Offline | 
								|  | « Ответ #17 :  12-01-2004 06:24 »   |  | 
 
 Надеюсь мои опасения напрасны о обходного пути записи/чтения на диск не существует (в рамках стандартной поставки О.С.)
 
 По моему нет. Выбор у приложений такой- или Nt(Zw)Read/WriteFile или Nt(Zw)DeviceIoControlFile. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |