Member 14087451 Ответов: 3

Исключение, брошенное на 0x76f96a35 (ntdll.dll) в xxx.exe: 0xc0000005: место записи нарушения доступа


мое приложение выходит из строя с ошибкой
Исключение, брошенное в 0x76F96A35 (ntdll.dll) в xxx.exe: 0xC0000005: нарушение доступа место записи 0x00000014. на линии

DWORD dwRetVal = GetTcpTable2(*table, ¤tTableSize, FALSE);


Что я уже пробовал:

вот мой код
DWORD GetPacketFromProcess(uint16_t localPort, uint32_t localV4Address, PMIB_TCPTABLE2* table, DWORD& currentTableSize)
                {
                    // We deliberately never permanently free the table on purpose. Eventually, this table will
                    // reach a size where reallocations don't happen anymore, and we can recycle it.
                    
                    if (currentTableSize == 0 )
                    {
                        currentTableSize = sizeof(MIB_TCPTABLE2);
                        *table = static_cast<PMIB_TCPTABLE2>(malloc(currentTableSize));
                    }

                    if (*table == nullptr)
                    {
                        currentTableSize = 0;
                        LogError(u8"GetPacketFromProcess(uint16_t, uint32_t, PMIB_TCPTABLE2, DWORD&) - Failed to initialize table.");
                        return 0;
                    }

                    // Exception here
                    //Exception thrown at 0x76F96A35 (ntdll.dll) in xxx.exe: 0xC0000005: Access violation writing location 0x00000014.
                    DWORD dwRetVal = GetTcpTable2(*table, ¤tTableSize, FALSE);
                    


                        if (dwRetVal  == ERROR_INSUFFICIENT_BUFFER)
                        {
                            free(*table);
                            *table = nullptr;

                            *table = static_cast<PMIB_TCPTABLE2>(malloc(currentTableSize));

                            if (*table == nullptr)
                            {
                                currentTableSize = 0;
                                LogError(u8"GetPacketFromProcess(uint16_t, uint32_t, PMIB_TCPTABLE2, DWORD&) - Failed to resize table.");
                                return 0;
                            }

                            dwRetVal = GetTcpTable2(*table, ¤tTableSize, FALSE);
                        }

                        if (dwRetVal == NO_ERROR)
                        {
                            // Table members, spare things like dwOwningPid, are in network order aka big endian.
                            for (DWORD i = 0; i < (*table)->dwNumEntries; ++i)
                            {
                                // The reason why we accept zero as the address is that it is equal to "0.0.0.0:PORT", so
                                // it counts.
                                if ((*table)->table[i].dwLocalAddr == localV4Address) // (*table)->table[i].dwLocalAddr == 0 && localV4Address == 0 || 
                                {
                                    // See https://msdn.microsoft.com/en-us/library/windows/desktop/aa366909(v=vs.85).aspx
                                    // Upper bits may contain junk data.
                                    if (((*table)->table[i].dwLocalPort & 0xFFFF) == localPort)
                                    {
                                        return (*table)->table[i].dwOwningPid;
                                    }
                                }
                            }
                            

                        }
                        else
                        {
                            LogError(u8"GetPacketFromProcess(uint16_t, uint32_t, PMIB_TCPTABLE2, DWORD&) - Failed to populate table.");

                            if (*table != nullptr)
                            {
                                free(*table);
                                *table = nullptr;
                            }

                            currentTableSize = 0;
                        }
                    
                                        
                    LogError("GetPacketFromProcess(uint16_t, uint32_t, PMIB_TCPTABLE2, DWORD&) - Default. Assuming SYSTEM process.");
                    return 4;
                }


iam вызывая эту функцию в цикле она считывает данные из сети, plz help

jeron1

Является ли ¤tTableSize правильным? Я не вижу его инициализированным. Что это за странный персонаж (¤)?

Member 14087451

Сэр, это символ амперсанда, возвращаемая таблица GetTcpTable2 и ее размер

jeron1

Это (&) - амперсанд, это ( ¤ ) - нет.

3 Ответов

Рейтинг:
2

OriginalGriff

К сожалению, мы не можем помочь - это будет зависеть от ваших данных, а также от вашего кода, и у нас нет никакого доступа к этому!

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей компиляторной системы, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
1

KarstenK

Это время шоу для Отладчик Наиболее распространенной проблемой является жук в вашем коде. Как уже говорилось ранее, доступ к 0x14 кричит о какой-то проблеме с указателем. Обычно это означает, что используемый указатель равен нулю (недопустим), и код добавляет это смещение для некоторого доступа к памяти. Где эта нулевая проблема часто возникает, когда данные не предоставляются.

Итак, поступили ли данные и скопированы в целевую память? Проверьте это в своем коде.


Рейтинг:
0

Stefan_Lang

Сообщение об ошибке говорит вам, что программа пытается записать на адрес 0x14, который, очевидно, является недопустимым адресом для записи. Будучи так близко к 0, причина этого адреса, скорее всего, заключается в том, что вы передали недопустимый указатель на GetTcpTable2, который использует его в качестве базового адреса для какой-то структуры, а затем пытаетесь записать в какой-то член этой структуры, который должен быть расположен по адресу [базовый адрес + 20 байт] (шестнадцатеричный 0x14).

Видеть Функция GetTcpTable2 (iphlpapi.h) | Microsoft Docs[^] : Вам нужно передать два указателя: первый-на структуру таблицы TCP, которая должна содержать полученную информацию, а второй-указатель на переменную, содержащую размер буфера, который вы передали в первом параметре.

Параметры, которые вы на самом деле передаете, являются *table и ¤tTableSize - первый-это разыменование переменной, которая может быть или не быть указателем, но, скорее всего, это не указатель. А вот второе... ну, понятия не имею, пока вы не исправите ту очевидную опечатку, которая у вас здесь есть. Проверьте пример кода на сайте, который я связал выше для справки, тогда это не должно быть так трудно решить.