| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 я неизменял) Привожу код, хотя это есть в Неббете. 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, и после какой из них возникает ошибка... Даже если ты все это проделал (типа и без Вас знаем Вот если бы под NT работало а под XP глючило это уже было бы интереснее (например если в XP возращается число а в NT 0 или -1 то скорее всего это и есть место ошибки) И извините если не к месту высказался |
| Автор: Бегемот 18.8.2003, 09:27 |
| Все уже проверял, фунцкии возвращают все одинаково (0 если удачно, а удачно всегда |
| Автор: 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. Вот такие пироги с котятами. Удачи в програмизме ! |