From 770a1250794833aa7d9a9596a7fc56bfc19c65f0 Mon Sep 17 00:00:00 2001<br>From: Jianqiu Zhang <zhangjianqiu_133@yeah.net><br>Date: Thu, 29 Oct 2015 15:33:28 +0800<br>Subject: [PATCH 1/2] wpcap: Implement pcap_dump_open and pcap_dump<br><br>Signed-off-by: Jianqiu Zhang <zhangjianqiu_133@yeah.net><br>---<br> dlls/wpcap/wpcap.c    | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++<br> dlls/wpcap/wpcap.spec |  4 ++--<br> 2 files changed, 56 insertions(+), 2 deletions(-)<br><br>diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c<br>index ae9e482..e03e18e 100644<br>--- a/dlls/wpcap/wpcap.c<br>+++ b/dlls/wpcap/wpcap.c<br>@@ -22,6 +22,8 @@<br> #include "winsock2.h"<br> #include "windef.h"<br> #include "winbase.h"<br>+#include "winternl.h"<br>+#include "ntstatus.h"<br> #include "wine/debug.h"<br> <br> WINE_DEFAULT_DEBUG_CHANNEL(wpcap);<br>@@ -40,6 +42,8 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);<br> #define PCAP_SRC_IFLOCAL        3<br> #endif<br> <br>+#define MAX_LENGTH 1024<br>+<br> void CDECL wine_pcap_breakloop(pcap_t *p)<br> {<br>     TRACE("(%p)\n", p);<br>@@ -339,3 +343,53 @@ int CDECL wine_wsockinit(void)<br>     if (WSAStartup(MAKEWORD(1,1), &wsadata)) return -1;<br>     return 0;<br> }<br>+<br>+pcap_dumper_t* CDECL wine_pcap_dump_open(pcap_t *p, const char *fname)<br>+{<br>+    UNICODE_STRING nt_name, dospathW;<br>+    ANSI_STRING fname_dos;<br>+    ANSI_STRING fname_unix;<br>+    CHAR fpath[MAX_LENGTH] = { 0 };<br>+    NTSTATUS res;<br>+    TRACE("(%p %s)\n", p, fname);<br>+    RtlInitAnsiString(&fname_dos, fname);<br>+    res = RtlAnsiStringToUnicodeString(&dospathW, &fname_dos, TRUE);<br>+    if(res)<br>+    {<br>+        SetLastError(RtlNtStatusToDosError(res));<br>+        return NULL;<br>+    }<br>+    if(!RtlDosPathNameToNtPathName_U(dospathW.Buffer, &nt_name, NULL, NULL))<br>+    {<br>+        RtlFreeUnicodeString(&dospathW);<br>+        SetLastError(ERROR_FILENAME_EXCED_RANGE);<br>+        return NULL;<br>+    }<br>+    res = wine_nt_to_unix_file_name(&nt_name, &fname_unix, FILE_OPEN_IF, FALSE);<br>+    if(res)<br>+    {<br>+        if(res == STATUS_NO_SUCH_FILE)<br>+            SetLastError(ERROR_SUCCESS);<br>+        else<br>+        {<br>+            RtlFreeUnicodeString(&dospathW);<br>+            RtlFreeUnicodeString(&nt_name);<br>+            SetLastError(RtlNtStatusToDosError(res));<br>+            return NULL;<br>+        }<br>+    }<br>+    else<br>+    {<br>+        SetLastError(ERROR_FILE_EXISTS);<br>+    }<br>+    memcpy(fpath, fname_unix.Buffer, fname_unix.Length);<br>+    RtlFreeUnicodeString(&nt_name);<br>+    RtlFreeUnicodeString(&dospathW);<br>+    RtlFreeAnsiString(&fname_unix);<br>+    return pcap_dump_open(p, fpath);<br>+}<br>+<br>+void CDECL wine_pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)<br>+{<br>+    return pcap_dump(user, h, sp);<br>+}<br>diff --git a/dlls/wpcap/wpcap.spec b/dlls/wpcap/wpcap.spec<br>index 66303b4..541fc49 100644<br>--- a/dlls/wpcap/wpcap.spec<br>+++ b/dlls/wpcap/wpcap.spec<br>@@ -16,12 +16,12 @@<br> @ cdecl pcap_datalink_val_to_description(long) wine_pcap_datalink_val_to_description<br> @ cdecl pcap_datalink_val_to_name(long) wine_pcap_datalink_val_to_name<br> @ cdecl pcap_dispatch(ptr long ptr ptr) wine_pcap_dispatch<br>-@ stub pcap_dump<br>+@ cdecl pcap_dump(ptr ptr ptr) wine_pcap_dump<br> @ stub pcap_dump_close<br> @ stub pcap_dump_file<br> @ stub pcap_dump_flush<br> @ stub pcap_dump_ftell<br>-@ stub pcap_dump_open<br>+@ cdecl pcap_dump_open(ptr str) wine_pcap_dump_open<br> @ stub pcap_file<br> @ stub pcap_fileno<br> @ cdecl pcap_findalldevs(ptr ptr) wine_pcap_findalldevs<br>-- <br>2.7.1<br>