Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кто чего знает о стеке Win 2000/NT, У меня прога не пашет под 2000 ,а под XP 
:(
    Опции темы
Бегемот
Дата 15.8.2003, 13:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет, народ !
Написал прогу создания процесса в 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



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

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

И извините если не к месту высказался smile.gif
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Бегемот
Дата 18.8.2003, 09:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Все уже проверял, фунцкии возвращают все одинаково (0 если удачно, а удачно всегда smile.gif). Пример взят из книги для NT/2000 значит и структуры поддерживаются. Но, все равно, спасибо за отвтет.
  Вверх
oleg1973
Дата 18.8.2003, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



у меня такая ошибка вылитала на в2000 при инициализации dll моей
хотя на ХР работала без проблем
разные немнога способы инициализации там


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Бегемот
Дата 19.8.2003, 12:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

Вот такие пироги с котятами.
Удачи в програмизме !
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1366 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.