Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Кто чего знает о стеке Win 2000/NT


Автор: Бегемот 15.8.2003, 13:37
Привет, народ !
Написал прогу создания процесса в Windows по примеру из книги Г.Неббета "Windows NT/2000 Native Api Reference". Прикол только в том, что я писал свою прогу под XP. И там она работает. Попробовал запускать ее под Windows 2000, то получил ошибку : "Ошибка при инициализации приложения (0xc00000fd)" . Вроде как это означает переполнение стека.
Пробовал увеличить стек - бесполезно.
Пробовал убрать охраняемую область за стеком - программа больше не ругается, но процесс тоже не живет.
Как же так получается, что на XP-юше идет, а под 2000 не хочет? (когда книжка-то для NT/2000 и код моей проги при переносе с XP я неизменял) confused.gif

Привожу код, хотя это есть в Неббете.
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 16.8.2003, 12:04
Хмммм...
о стеке этом ничего не знаю но я обычно ищу то конкретное место где возникает ошибка... попробуй вставить везде где только можно команды вывода сообщений в которых просматривай возвращаемые каждой функцией значения...
Сравни какие значения возвращают эти функции в XP и 2000, и после какой из них возникает ошибка...
Даже если ты все это проделал (типа и без Вас знаем smile.gif ) информация об этом не помешает тем кто захочет тебе помочь smile.gif

Вот если бы под NT работало а под XP глючило это уже было бы интереснее smile.gif а так скорее всего одна из используемых тобой функций или структур поддерживается в XP но еще не была реализована в NT остается только узнать какая smile.gif
(например если в XP возращается число а в NT 0 или -1 то скорее всего это и есть место ошибки)

И извините если не к месту высказался smile.gif

Автор: Бегемот 18.8.2003, 09:27
Все уже проверял, фунцкии возвращают все одинаково (0 если удачно, а удачно всегда smile.gif). Пример взят из книги для NT/2000 значит и структуры поддерживаются. Но, все равно, спасибо за отвтет.

Автор: oleg1973 18.8.2003, 13:25
у меня такая ошибка вылитала на в2000 при инициализации dll моей
хотя на ХР работала без проблем
разные немнога способы инициализации там

Автор: Бегемот 19.8.2003, 12:32
[Oleg1973] - Совершенно верно !
Оказалось что дело было даже не в стеке.
Я создаю объект процесс и заполняю его недокументированной функцией RtlCreateProcessParameters (как в примере у Неббета). И получается так, что эта функция при передаче параметров ведет себя более лояльно в XP, чем в 2000. В Windows 2000/NT RtlCreateProcessParameters выдает переполнение стека, если ей передать в качестве параметра ImageFile строку имени программы без указания пути.
Т.е. : exec.exe - в XP покатит, а в 2000 - нет
c:\\work\\exec.exe - покатит и в XP и в NT/2000.

Вот такие пироги с котятами.
Удачи в програмизме !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)