WinDivert 1.0.5 DivertRecv () Метод Получить последнюю ошибку 998

0

Я писал свою оболочку С# для WFP (платформа фильтрации Windows), я использую WinDivert 1.0.5, этот синтаксис импорта

[DllImportAttribute("WinDivert.dll", EntryPoint = "DivertRecv",SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
            [return: MarshalAsAttribute(UnmanagedType.Bool)]
            public static extern bool DivertRecv([InAttribute()] System.IntPtr handle,
                                                  [OutAttribute()]  System.IntPtr pPacket, 
                                                  [InAttribute()]  uint packetLen,
                                      [ OutAttribute()]  System.IntPtr pAddr,
                                      [OutAttribute()]  System.IntPtr readLen);

и этот синтаксис вызова функции

if( DivertRecv(handle, Ppacket, (uint)(8 * packet.Length-1),
                 Paddr,  Ppacket_len) == false)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("warning: failed to read packet {0} .", Marshal.GetLastWin32Error());
                    Console.ResetColor();
                    Console.WriteLine(" Press any key to Exit ...");
                    Console.ReadKey();
                    Environment.Exit(1);
}

но функция возвращает false с каждым вызовом, а GetLastWin32Error() получает код ошибки 998. PLZ помочь мне.

Теги:
wfp

1 ответ

0
Лучший ответ

998 = ERROR_NOACCESS (Недействительный доступ к ячейке памяти). Вероятно, это связано с передачей неверного указателя на DivertRecv.

Является ли параметр pPacket указателем на предварительно выделенный буфер размера пакетаLen?

  • 0
    сэр Бэзил, спасибо за ответ ... я объявляю pPacket следующим образом: - IntPtr Ppacket = new IntPtr (Marshal.SizeOf (typeof (PACKET))); и ПАКЕТ является типом структуры, объявленной в моем проекте ..
  • 0
    Я не думаю, что декларация верна. Он просто создает IntPtr, битовое значение которого является целочисленным результатом sizeof. Это не выделение какой-либо памяти.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню