C# platform invoke

0

Witam,

Usiłuje wywołać natywną funkcję WinApi z kodu C#, używam System.Runtime.InteropServices (platform invoke). Funkcją tą jest GetExtendedTcpTable, zwraca ona tablicę endpointów TCP. Jej nagłówek w natywnym kodzie (C++) wygląda tak:

DWORD GetExtendedTcpTable(
  __out         PVOID pTcpTable,
  __in_out      PDWORD pdwSize,
  __in          BOOL bOrder,
  __in          ULONG ulAf,
  __in          TCP_TABLE_CLASS TableClass,
  __in          ULONG Reserved
);

Funkcja ta działa w ten sposób, że zwraca dane pod pTcpTable. W drugim parametrze (pdwSize) przekazujemy [in] ile bajtów zarezerwowaliśmy pod tablicę (rezerwujemy przed zawołaniem). Jeśli zarezerwowaliśmy za mało to funkcja zwraca ERROR_INSUFFICIENT_BUFFER a pod pdwSize znajdziemy wtedy [out] wartość jaką powinniśmy zaalokować.

Słowem, wymyślone jest to w taki sposób jakby twórcy oczekiwali że wywołanie nastąpi dwa razy: pierwszym razem wołamy by dowiedzieć się ile bajtów ma mieć bufor, potem rezerwujemy pamięć i wołamy drugi raz, przekazując pointer do naszego bufora oraz informację o jego wielkości.

W C++ wszystko działa ładnie. Chcę zrobić to w C# używając platform invoke.

Początkowo napisałem coś takiego:

        [DllImport("Iphlpapi.dll", SetLastError = true)]
        public static extern int GetExtendedTcpTable(out IntPtr pTcpTable, ref int pdwSize, bool bOrder, UInt32 ulAf, TcpTableClass TableClass, UInt32 Reserved);

(TcpTableClass to moj enum).

Wywołanie tej metody działa. Np coś takiego:

int returnCode = GetExtendedTcpTable(out pTcpTable, ref size, false, 2, TcpTableClass.TCP_TABLE_OWNER_PID_CONNECTIONS, 0);

Wszystko się zgadza, pod returnCode dostaję numer odpowiadający ERROR_INSUFFICIENT_BUFFER a size dostaje pożądaną wielkość bufora. Mam problem - co dalej? Jak zaalokować te x bajtów w miejsce wskazywane przez IntPtr i po ponownym wywołaniu dostać tam właściwe dane? Czy IntPtr to zły typ w tym miejscu i powinienem użyć innego?

0

Dzięki, dokładnie tego szukałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1