Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Написание NativeAPI - приложений |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 07 января 2007 08:54 · Личное сообщение · #1 Всё начилось с того, что решил перенести участок кода: for(int i = 10; i >= 0; i--) { Sleep (1000); printf ("Timer: %d second(s). ", i); } который на С++ в Win32 консольном приложении работает нормально, теперь переписываю на NativeAPI и столкнулся с проблемой: Функция Sleep вызывает SleepEx, а она ZwDelayExecution(), так вот написав программу линкер говорит что функцию не знает хотя другие всё нормально (типа ZwCreateFile, ZwReadFile, ZwWriteFile ,ZwClose....). Короче проверил DDK, там её нет друзья говорят, что она недокументированна и её описания нет в DDK посоветовали попробовать вызвать её непосредственно из Ntdll.dll, в Windows-приложении типа так: #define _WIN32_WINNT 0x0500 #include <windows.h> #include <winternl.h> NTSTATUS (__stdcall *NtDelayExecution)(BOOL, const LARGE_INTEGER*); int main() { LARGE_INTEGER la; la.QuadPart = -10000000i64; // Пауза в 1 секунду NtDelayExecution=(NTSTATUS (__stdcall *)(BOOL, const LARGE_INTEGER*)) GetProcAddress(GetModuleHandle("ntdll.dll"), "NtDelayExecution"); if(NtDelayExecution==NULL) MessageBox(NULL, "GetProcAddress() fail", "test", MB_OK); else NtDelayExecution(FALSE, &la); } но я пишу NativeAPI приложение и использовать WinAPI не могу так же как и при разработке драйверов. Кроме того ни NtGetProcAddress() ни NtGetModuleHandle() в Ntdll.dll и впомине нет, зато узнал, что часть экспортируемых функций из Ntdll.dll с префиксом Ldr - являются загрузчиками образа, например: LdrGetDllHandle( IN PWORD pwPath OPTIONAL, IN PVOID Unused OPTIONAL, IN PUNICODE_STRING ModuleFileName, OUT PHANDLE pHModule ); LdrGetProcedureAddress( IN HMODULE ModuleHandle, IN PANSI_STRING FunctionName OPTIONAL, IN WORD Oridinal OPTIONAL, OUT PVOID *FunctionAddress ); LdrLoadDll( IN PWCHAR PathToFile OPTIONAL, IN ULONG Flags OPTIONAL, IN PUNICODE_STRING ModuleFileName, OUT PHANDLE ModuleHandle ); Не подскажите всё-таки возможно ли перенести данный участок простенького кода? Другие функции Ldr из библиотеки Ntdll.dll LdrAccessOutOfProcessResource LdrAccessResource LdrAddRefDll LdrAlternateResourcesEnabled LdrCreateOutOfProcessImage LdrDestroyOutOfProcessImage LdrDisableThreadCalloutsForDll LdrEnumResources LdrEnumerateLoadedModules LdrFindCreateProcessManifest LdrFindEntryForAddress LdrFindResourceDirectory LdrFindResourceEx LdrFindResource LdrFlushAlternateResourceModules LdrGetDllHandle LdrGetDllHandleEx LdrGetProcedureAddress LdrHotPatchRoutine LdrInitShimEngineDynamic LdrInitializeThunk LdrLoadAlternateResourceModule LdrLoadDll LdrLockLoaderLock LdrProcessRelocationBlock LdrQueryImageFileExecutionOptions LdrQueryProcessModuleInformation LdrSetAppCompatDllRedirectionCallback LdrSetDllManifestProber LdrShutdownProcess LdrShutdownThread LdrUnloadAlternateResourceModule LdrUnloadDll LdrUnlockLoaderLock LdrVerifyImageMatchesChecksum ![]() |
|
Создано: 08 января 2007 01:20 · Личное сообщение · #2 |
|
Создано: 08 января 2007 03:42 · Личное сообщение · #3 |
|
Создано: 08 января 2007 04:40 · Личное сообщение · #4 |
|
Создано: 08 января 2007 13:47 · Личное сообщение · #5 |
|
Создано: 08 января 2007 13:52 · Личное сообщение · #6 Ну ладно а как насчёт функции printf - вместо неё я использовал: //очень просто UNICODE_STRING string; RtlInitUnicodeString(&string, L"To skip disk checking, press any key within %d second(s). "); NtDisplayString(&string); но она поддерживает но - выдаёт ошибку NtDisplayString(&string, i);//видимо нельзя как в printf Подскажите другая функция, или вызвать по другому? ![]() |
|
Создано: 08 января 2007 14:39 · Личное сообщение · #7 может эта функция? ZwDisplayString ZwDisplayString displays a string. NTSYSAPI NTSTATUS NTAPI ZwDisplayString(IN PUNICODE_STRING String); Parameters String Specifies a string to be displayed. Return Value Returns STATUS_SUCCESS or an error status,such as STATUS_PRIVILEGE_NOT_HELD Related Win32 Functions None. Remarks SeTcbPrivilege is required to display a string. ZwDisplayString only displays the string if the HAL still owns the display driver takes ownership) or if a crash dump is in progress. ----- Уважайте других и пишите грамотно. ![]() |
|
Создано: 08 января 2007 15:38 · Личное сообщение · #8 Знаешь что NtCreateFile и ZwCreateFile одна и таже фигня, а различаются лишь тем, что первая - Native API функция вторая - альтернативный интерфейс Native API. Тут надо либо другую либо может я вызываю не так ведь можно использовать и и не думаю, что разработчики стали бы так делать. Executioner как думаешь? ![]() |
|
Создано: 08 января 2007 20:07 · Личное сообщение · #9 |
|
Создано: 08 января 2007 21:29 · Личное сообщение · #10 |
|
Создано: 08 января 2007 22:02 · Поправил: HoBleen · Личное сообщение · #11 sxd пишет: Ну ладно а как насчёт функции printf - вместо неё я использовал: Попробуй сначала sprintf (он же вроде чисто алгоритмический), а потом NtDisplayString. Paxan пишет: кто-нибудь обьясните мне сокральный смысл писать чисто на NativeApi. Для программ, кот. грузятся сразу после загрузки ядра - скандиск, партишн мэджик, короче для прог, работающих с хардом (например) и которым необходимо отсутствие других программ в памяти. ![]() |
|
Создано: 09 января 2007 03:24 · Личное сообщение · #12 |
|
Создано: 09 января 2007 04:54 · Личное сообщение · #13 |
|
Создано: 09 января 2007 05:01 · Личное сообщение · #14 |
|
Создано: 09 января 2007 06:35 · Личное сообщение · #15 |
|
Создано: 09 января 2007 07:06 · Поправил: HoBleen · Личное сообщение · #16 |
|
Создано: 09 января 2007 10:42 · Личное сообщение · #17 |
|
Создано: 09 января 2007 11:37 · Личное сообщение · #18 |
|
Создано: 09 января 2007 13:51 · Личное сообщение · #19 HoBleen у меня тут косяк вышел всё нормально, компилирует код: __declspec(dllimport) NTAPI NtDelayExecution( IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval ); for(i = 0; i < 10; i++) { NtDelayExecution(FALSE, 5000); sprintf (&string, "Timer %d second(s). ", i); NtDisplayString(&string); } Этот код, но на экране нет нифига! ТОбишь Всё без ошибок, но не пашет ни задержки ни вывода секунд нет! Может из-за NtDisplayString, обычно используют так: UNICODE_STRING string; RtlInitUnicodeString(&string, L" HELLO WORLD!"); NtDisplayString(&string); но тогда возврат каретки теряет смысл! ![]() |
|
Создано: 10 января 2007 07:13 · Личное сообщение · #20 Держи текст самого Марка Руссиновича. Основная ошибка - в нативе вход не main, а // Instead of a 'main' or 'winmain', NT applications are entered via // this entry point. // //-------------------------------------------------------------------- -- void NtProcessStartup( PSTARTUP_ARGUMENT Argument ) { RTL_HEAP_DEFINITION heapParams; ![]() ![]() |
|
Создано: 10 января 2007 07:19 · Личное сообщение · #21 |
|
Создано: 10 января 2007 08:49 · Личное сообщение · #22 sxd пишет: sprintf (&string, "Timer %d second(s). ", i); NtDisplayString(&string); Дык параметр - юникодовская строка, а не массив char'ов. А про то, где она создается - могу предположить, что например при копировании UNICODE_STRING новая строка будет указывать на тот же буфер. Для сохранности она размещается вдали от инициализационных данных. ИМХО. Еще мб поможет - Warning: Trying to display string without previously switch to text-mode results as system hang. ![]() |
|
Создано: 10 января 2007 13:20 · Личное сообщение · #23 tundra37 написал: Основная ошибка - в нативе вход не main, а // Instead of a 'main' or 'winmain', NT applications are entered via // this entry point. // //-------------------------------------------------------------------- -- void NtProcessStartup( PSTARTUP_ARGUMENT Argument )
какой от этого смысл? Ну а если я так напишу ошибки то нет и тоже работает: #pragma comment(linker, "/SUBSYSTEM:NATIVE")
Какая разница? HoBleen написал: Так по поводу строки? ![]() |
|
Создано: 10 января 2007 20:28 · Личное сообщение · #24 |
|
Создано: 11 января 2007 03:11 · Личное сообщение · #25 sxd пишет: Так по поводу строки? Так посмотрел бы текст : PWCHAR stringBuffer, argPtr; UNICODE_STRING helloWorld; ........................................ stringBuffer = RtlAllocateHeap( Heap, 0, 256 ); swprintf( stringBuffer, L" %s", argPtr ); helloWorld.Buffer = stringBuffer; helloWorld.Length = wcslen( stringBuffer ) * sizeof(WCHAR); helloWorld.MaximumLength = helloWorld.Length + sizeof(WCHAR); NtDisplayString( &helloWorld ); ======================= По поводу входа - наверно просто это стандартное имя - тут я согласен, что все равно. heap тоже вроде не по делу - можно и в проге зарезервировать. Но вот строка специфическая - там указатель, а не сама строка. ![]() |
|
Создано: 11 января 2007 07:06 · Личное сообщение · #26 tundra37 пишет: По поводу входа - наверно просто это стандартное имя - тут я согласен, что все равно. Угу, это просто инфа о ЕР для линкера - ничего больше. tundra37 пишет: heap тоже вроде не по делу - можно и в проге зарезервировать. Скорее всего не важно, но для точности нужно посмотреть в доки. Только вот у меня про найтив практически нету литературы. Кто найдет - отпоститесь, пожалуйста. tundra37 пишет: Но вот строка специфическая - там указатель, а не сама строка. Про них все доходчиво написано в Солдатове "Программирование драйверов Windows" - wingman.org.ru/books/files/C/Soldatov_-_Drivers_for_Windows(RUS).rar ![]() |
|
Создано: 11 января 2007 11:21 · Личное сообщение · #27 tundra37 пишет: По поводу входа - наверно просто это стандартное имя - тут я согласен, что все равно. Угу, это просто инфа о ЕР для линкера - ничего больше. Да и в экзешнике места пустого просто жуть размер которого возрастает до 7 кб, что-то наподобе PE-заголовка, тогда как если не страдать такой хренью размер 2 кб. Да и компилить в VC++ намного удобнее. NtDisplayString() - проблема, вообще я попробовал, так: UNICODE_STRING str; for(i = 0; i < 10; i++) { RtlInitUnicodeString(&string, L"Timer %d%% second(s). ", i);//типа как в printf() NtDisplayString(&str, i); } Вообще код скомпилило и при выводе такое ощущение, что возврат каретки действует, тобишь строку выводит и она видно как бы дёргается обновляется но вот выводит: Timer %d%% second(s). Походу дела спецификаторы вида %d - неподдерживается или пора пиво бросить ![]() Почему так? ![]() |
|
Создано: 11 января 2007 12:01 · Личное сообщение · #28 sxd пишет: Вообще код скомпилило и при выводе такое ощущение, что возврат каретки действует Извини, но в упор не вижу перевода каретки. sxd пишет: Походу дела спецификаторы вида %d - неподдерживается или пора пиво бросить Не поддерфивается - почитай Солдатова - ссылка выше. Думаю надо использовать (w)sprintf. ![]() |
|
Создано: 11 января 2007 12:08 · Личное сообщение · #29 Блин, HoBleen извини вот поправил: UNICODE_STRING str; for(i = 0; i < 10; i++) { RtlInitUnicodeString(&string, L"Timer %d%% second(s). ", i);//типа как в printf() NtDisplayString(&str, i); } Не поддерфивается - почитай Солдатова - ссылка выше. Думаю надо использовать (w)sprintf. wsprintf() - виндовая функция (API) использовать нельзя, sprintf() можно, а какие примерные соображения по поводу этой функции? ![]() |
|
Создано: 11 января 2007 12:14 · Личное сообщение · #30 Гы) обратный слеш низзя постить =))) sxd пишет: wsprintf() - виндовая функция (API) использовать нельзя, sprintf() можно, а какие примерные соображения по поводу этой функции? Ну если не ошибаюсь она линкуется со всей библой си (по умолчанию). А по использованию - что типа sprintf(szStr, "lalala%d%d", x, y); Дальше по этой sz char формируешь ANSI_STRING, из нее - UNICODE_STRING (Это можно если, как ты говоришь, через sprintf - без w) ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Написание NativeAPI - приложений |