![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Бегемот |
|
|||
|
Unregistered |
Привет, народ !
Написал прогу создания процесса в Windows по примеру из книги Г.Неббета "Windows NT/2000 Native Api Reference". Прикол только в том, что я писал свою прогу под XP. И там она работает. Попробовал запускать ее под Windows 2000, то получил ошибку : "Ошибка при инициализации приложения (0xc00000fd)" . Вроде как это означает переполнение стека. Пробовал увеличить стек - бесполезно. Пробовал убрать охраняемую область за стеком - программа больше не ругается, но процесс тоже не живет. Как же так получается, что на XP-юше идет, а под 2000 не хочет? (когда книжка-то для NT/2000 и код моей проги при переносе с XP я неизменял) Привожу код, хотя это есть в Неббете. dwCheck - переменная отслеживает результаты выполнения Zw-функций sii - SectionImageInformation структура STACK_INFO - то же самое что и USER_STACK у Неббета. ... // Создаем стек пользовательского режима. Выделяем под него память и заполняем поля структуры стека. STACK_INFO stack = {0}; ULONG n = sii.StackReserve; dwCheck = (DWORD) ZwAllocateVirtualMemory(hProcess, &stack.AllocationBase, 0, &n, MEM_RESERVE, PAGE_READWRITE); stack.StackBase = PCHAR(stack.AllocationBase) + sii.StackReserve; stack.StackLimit = PCHAR(stack.StackBase) - sii.StackCommit; n = sii.StackCommit + PAGE_SIZE; PVOID p = PCHAR(stack.StackBase) - n; dwCheck = (DWORD) ZwAllocateVirtualMemory(hProcess, &p, 0, &n, MEM_COMMIT, PAGE_READWRITE); ULONG x; n = PAGE_SIZE; // Устанавливаем защиту страниц в конце фиксированной области стека. dwCheck = (DWORD) ZwProtectVirtualMemory(hProcess, &p, &n, PAGE_READWRITE | PAGE_GUARD, &x); В приведенном коде не все названия полей совпадают с Неббетовским примером, но они все соответствуют им. Просто я когда доставал файл заголовков через Интернет(ntdll.h), то по началу он попался немного другой. Но если все работает в XP, то почему же в 2000 глючит? |
|||
|
||||
| HexoGenus |
|
|||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Хмммм...
о стеке этом ничего не знаю но я обычно ищу то конкретное место где возникает ошибка... попробуй вставить везде где только можно команды вывода сообщений в которых просматривай возвращаемые каждой функцией значения... Сравни какие значения возвращают эти функции в XP и 2000, и после какой из них возникает ошибка... Даже если ты все это проделал (типа и без Вас знаем Вот если бы под NT работало а под XP глючило это уже было бы интереснее (например если в XP возращается число а в NT 0 или -1 то скорее всего это и есть место ошибки) И извините если не к месту высказался --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
|||
|
||||
| Бегемот |
|
|||
|
Unregistered |
Все уже проверял, фунцкии возвращают все одинаково (0 если удачно, а удачно всегда
|
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
у меня такая ошибка вылитала на в2000 при инициализации dll моей
хотя на ХР работала без проблем разные немнога способы инициализации там -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Бегемот |
|
|||
|
Unregistered |
[Oleg1973] - Совершенно верно !
Оказалось что дело было даже не в стеке. Я создаю объект процесс и заполняю его недокументированной функцией RtlCreateProcessParameters (как в примере у Неббета). И получается так, что эта функция при передаче параметров ведет себя более лояльно в XP, чем в 2000. В Windows 2000/NT RtlCreateProcessParameters выдает переполнение стека, если ей передать в качестве параметра ImageFile строку имени программы без указания пути. Т.е. : exec.exe - в XP покатит, а в 2000 - нет c:\\work\\exec.exe - покатит и в XP и в NT/2000. Вот такие пироги с котятами. Удачи в програмизме ! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |