Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [NtQuerySystemInformation] STATUS_NO_MEMORY, Поиск проблемы. 
:(
    Опции темы
Whisper
  Дата 15.4.2015, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.4.2015

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



Доброго времени суток.

Перечисляю хендлы с помощью NtQuerySystemInformation параметром SystemHandleInformation, всё работает идеально, но спустя несколько часов получаю либо STATUS_ACCESS_VIOLATION либо STATUS_NO_MEMORY, и не знаю даже в чем проблема.

Вот код реализации:
Код

            DWORD dwBufferSize = sizeof(SYSTEM_HANDLE) + sizeof(ULONG);
            // ----
            NTSTATUS NtStatus = STATUS_SUCCESS;
            // ----
            PSYSTEM_HANDLE_INFORMATION lpSystemHandles = {NULL};
            // ----
            do 
            {
                if(lpSystemHandles)
                {
                    HeapFree(GetProcessHeap(), 0, lpSystemHandles);
                }
                // ----
                dwBufferSize += (sizeof(SYSTEM_HANDLE) + sizeof(ULONG)) * 2;
                // ----
                lpSystemHandles = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(HeapAlloc(GetProcessHeap(), NULL, dwBufferSize));
                // ----
                NtStatus = NtQuerySystemInformation(SystemHandleInformation, lpSystemHandles, dwBufferSize, &dwBufferSize);
                // ----
                if(NtStatus == STATUS_SUCCESS)
                {
                    break;
                }
                // ----
                if(NtStatus != STATUS_SUCCESS)
                {
                    if(NtStatus == STATUS_INFO_LENGTH_MISMATCH)
                    {
                        continue;
                    }
                    // ----
                    if(NtStatus == STATUS_ACCESS_VIOLATION || NtStatus == STATUS_NO_MEMORY)
                    {
                        if(lpSystemHandles)
                        {
                            HeapFree(GetProcessHeap(), 0, lpSystemHandles);
                        }
                        // ----
                        return false;
                    }
                    // ----
                    HeapFree(GetProcessHeap(), NULL, lpSystemHandles);
                }
            } while (true);



Может сталкивался кто с данной проблемой или даст хоть какие-то наводки.

Заранее спасибо.

П.С. Использовал и malloc && free - такая же проблема.
PM MAIL   Вверх
xvr
Дата 15.4.2015, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



lpSystemHandles за циклом возвращается обратно в heap?

PM MAIL   Вверх
Whisper
Дата 15.4.2015, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.4.2015

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



Да, конечно, после обработки данных я освобождаю память.
PM MAIL   Вверх
xvr
Дата 15.4.2015, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Видимо где то что то не освободилось - покажите код

PM MAIL   Вверх
Whisper
Дата 16.4.2015, 05:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.4.2015

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



Код

        DWORD EnumHandles()
        {
            DWORD dwBufferSize = sizeof(SYSTEM_HANDLE) + sizeof(ULONG);
            // ----
            NTSTATUS NtStatus = STATUS_SUCCESS;
            // ----
            PSYSTEM_HANDLE_INFORMATION lpSystemHandles = {NULL};
            // ----
            do 
            {
                if(lpSystemHandles)
                {
                    HeapFree(GetProcessHeap(), 0, lpSystemHandles);
                }
                // ----
                dwBufferSize += (sizeof(SYSTEM_HANDLE) + sizeof(ULONG)) * 2;
                // ----
                lpSystemHandles = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(HeapAlloc(GetProcessHeap(), NULL, dwBufferSize));
                // ----
                if(lpSystemHandles == NULL)
                {
                    return false;
                }
                // ----
                NtStatus = Service::Dependency::s->_NtQuerySystemInformation(SystemHandleInformation, lpSystemHandles, dwBufferSize, &dwBufferSize);
                // ----
                if(NtStatus == STATUS_SUCCESS)
                {
                    break;
                }
                // ----
                if(NtStatus != STATUS_SUCCESS)
                {
                    if(NtStatus == STATUS_INFO_LENGTH_MISMATCH)
                    {
                        continue;
                    }
                    // ----
                    if(NtStatus == STATUS_ACCESS_VIOLATION || NtStatus == STATUS_NO_MEMORY)
                    {
                        if(lpSystemHandles)
                        {
                            HeapFree(GetProcessHeap(), 0, lpSystemHandles);
                        }
                        // ----
                        if(Service::EngineMode::EngineStatus->IsDebugAll())
                            Service::Logging::cLog->Write("%d 0x%X", __LINE__, NtStatus);
                        // ----
                        return false;
                    }
                    // ----
                    Service::Logging::cLog->Write("EnumHandles(): System error->(0x%X).", NtStatus);
                    // ----
                    HeapFree(GetProcessHeap(), NULL, lpSystemHandles);
                    // ----
                    Service::Dependency::s->Close(); //ExitProcess
                }
            } while (true);
            // ----
            this->g_PID.clear();
            // ----
            USHORT uLastPid = 0;
            // ----
            HANDLE hProcess = NULL;
            // ----
            for(DWORD k = 0; k < lpSystemHandles->uCount; ++ k)
            {
                PSYSTEM_HANDLE_TABLE_ENTRY_INFO lpHandle = reinterpret_cast<PSYSTEM_HANDLE_TABLE_ENTRY_INFO>(&lpSystemHandles->aSH[k]);
                // ----
                if(lpHandle->UniqueProcessId == Service::SystemInfo::SystemRead->dwMainPid)
                {
                    continue;
                }
                // ----
                if(uLastPid != lpHandle->UniqueProcessId)
                {
                    if(hProcess != NULL)
                    {
                        Service::Dependency::s->_ZwClose(hProcess);
                        // ----
                        hProcess = NULL;
                    }
                    // ----
                    uLastPid = lpHandle->UniqueProcessId;
                    // ----
                    hProcess = Service::Dependency::s->_ZwOpenProcess(PROCESS_DUP_HANDLE, lpHandle->UniqueProcessId);
                    // ----
                    if(!hProcess)
                    {
                        continue;
                    }
                }
                // ----
                if((lpHandle->GrantedAccess == 0x0012019F) || (lpHandle->GrantedAccess == 0x001A019F) || (lpHandle->GrantedAccess == 0x00120189) || (lpHandle->GrantedAccess == 0x00100000))
                {
                    continue;
                }
                // ----
                HANDLE hDuplicateHandle = INVALID_HANDLE_VALUE;
                // ----
                if(!NT_SUCCESS(Service::Dependency::s->_NtDuplicateObject(hProcess, reinterpret_cast<HANDLE>(lpHandle->HandleValue), NtCurrentProcess(), &hDuplicateHandle, NULL, FALSE, DUPLICATE_SAME_ACCESS)))
                {
                    continue;
                }
                // ----
                POBJECT_TYPE_INFORMATION lpObjectType = reinterpret_cast<POBJECT_TYPE_INFORMATION>(HeapAlloc(GetProcessHeap(), NULL, 4096));
                // ----
                if(!NT_SUCCESS(Service::Dependency::s->_NtQueryObject(hDuplicateHandle, ObjectTypeInformation, lpObjectType, 4096, NULL)))
                {
                    Service::Dependency::s->_ZwClose(hDuplicateHandle);
                    // ----
                    HeapFree(GetProcessHeap(), NULL, lpObjectType);
                    // ----
                    continue;
                }
                // ----
                if(lstrcmpW(lpObjectType->Name.Buffer, L"Process"))
                {
                    Service::Dependency::s->_ZwClose(hDuplicateHandle);
                    // ----
                    HeapFree(GetProcessHeap(), NULL, lpObjectType);
                    // ----
                    continue;
                }
                // ----
                HeapFree(GetProcessHeap(), NULL, lpObjectType);
                // ----
                PROCESS_BASIC_INFORMATION lpProcessBasicInfo = {NULL};
                // ----
                ULONG uProcessBasicSize = 0x00;
                // ----
                if(!NT_SUCCESS(Service::Dependency::s->_NtQueryInformationProcess(hDuplicateHandle, ProcessBasicInformation, &lpProcessBasicInfo, sizeof(lpProcessBasicInfo), NULL)))
                {
                    Service::Dependency::s->_ZwClose(hDuplicateHandle);
                    // ----
                    continue;
                }
                // ----
                if(lpProcessBasicInfo.uUniqueProcessId == Service::SystemInfo::SystemRead->dwMainPid)
                {
                    this->g_PID.push_back(lpHandle->UniqueProcessId);
                }
                // ----
                Service::Dependency::s->_ZwClose(hDuplicateHandle);
            }
            // ----
            if(hProcess != NULL)
            {
                Service::Dependency::s->_ZwClose(hProcess);
            }
            // ----
            if(lpSystemHandles)
            {
                HeapFree(GetProcessHeap(), NULL, lpSystemHandles);
            }
            // ----
            return TRUE;
        }



Это сообщение отредактировал(а) Whisper - 17.4.2015, 10:53
PM MAIL   Вверх
xvr
Дата 16.4.2015, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Криминала не видно. Попробуйте в вызове NtQuerySystemInformation для последнего параметра сделать свою переменную.

PM MAIL   Вверх
Whisper
Дата 16.4.2015, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.4.2015

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



Сделал, надеюсь что поможет, хотя врядли такая мелочь может что-то изменить.

Спасибо smile

Это сообщение отредактировал(а) Whisper - 16.4.2015, 19:32
PM MAIL   Вверх
feodorv
Дата 17.4.2015, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Небольшое замечание по приведённому коду. В плане обработки hProcess наметилось недоразумение:
Цитата(Whisper @  16.4.2015,  05:32 Найти цитируемый пост)
           HANDLE hProcess = INVALID_HANDLE_VALUE;
...
                    if(hProcess)
                    {
                        Service::Dependency::s->_ZwClose(hProcess);
                        // ----
                        hProcess = INVALID_HANDLE_VALUE;
                    }
...
                    if(!hProcess)
                    {
                        continue;
                    }

Дело в том, что INVALID_HANDLE_VALUE определено как
Код
#define INVALID_HANDLE_VALUE        ((HANDLE)(-1))
и путать его с NULL'ом не корректно. Более того, hProcess, будучи открытым последний раз с помощью _ZwOpenProcess, более нигде не закрывается, что должно приводить к утечке ресурсов.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Whisper
Дата 17.4.2015, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.4.2015

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



Спасибо большое, да, действительно, не закрывается нигде последний hProcess.
Исправил код. smile

Это сообщение отредактировал(а) Whisper - 17.4.2015, 10:52
PM MAIL   Вверх
feodorv
Дата 17.4.2015, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



А насчет INVALID_HANDLE_VALUE?)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Whisper
Дата 18.4.2015, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.4.2015

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



А насчёт INVALID_HANDLE_VALUE - мысль понял smile

Спасибо smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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