[PATCH 1/2] wpcap: Implement pcap_dump_open and pcap_dump

Jianqiu Zhang zhangjianqiu_133 at yeah.net
Wed Feb 10 22:48:24 CST 2016


I forgot to provide my code in the last post, Here is the code

--wpcap.c--

pcap_dumper_t* CDECL wine_pcap_dump_open(pcap_t *p, const char *fname)
{
    UNICODE_STRING nt_name, dospathW;
    ANSI_STRING fname_dos;
    ANSI_STRING fname_unix;
    NTSTATUS res;
    RtlInitAnsiString(&fname_dos, fname);
    res = RtlAnsiStringToUnicodeString(&dospathW, &fname_dos, TRUE);
    printf("RtlAnsiStringToUnicodeString retval = %X\n", res);
    if(res == STATUS_INVALID_PARAMETER_2)
    {
        SetLastError(ERROR_FILENAME_EXCED_RANGE);
        return NULL;
    }
    if(!RtlDosPathNameToNtPathName_U(dospathW.Buffer, &nt_name, NULL, NULL))
    {
        printf("RtlDosPathNameToNtPathName_U retval = %X\n", res);
        RtlFreeUnicodeString(&dospathW);
        SetLastError(ERROR_FILENAME_EXCED_RANGE);
        return NULL;
    }
    res  = wine_nt_to_unix_file_name(&nt_name, &fname_unix, FILE_OPEN_IF, FALSE);
    printf("VOID_DEBUG: Nt FileName is %s\n", wine_dbgstr_w(nt_name.Buffer));
    printf("wine_nt_to_unix_file_name retval = %X\n", res);
    if(res == STATUS_NO_SUCH_FILE)
    {
        SetLastError(ERROR_SUCCESS);
    }
    else if(res == STATUS_OBJECT_NAME_INVALID)
    {
        RtlFreeUnicodeString(&dospathW);
        SetLastError(ERROR_INVALID_NAME);
        return NULL;
    }
    else if(res == STATUS_OBJECT_NAME_NOT_FOUND || res == STATUS_OBJECT_PATH_NOT_FOUND)
    {
        RtlFreeUnicodeString(&dospathW);
        SetLastError(ERROR_PATH_NOT_FOUND);
        return NULL;
    }
    else
    {
        SetLastError(ERROR_FILE_EXISTS);
    }
    RtlFreeUnicodeString(&nt_name);
    RtlFreeUnicodeString(&dospathW);
    return pcap_dump_open(p, fname_unix.Buffer);
}


--wpcap.c--

--test.c--
//#define HAVE_REMOTE
#include <pcap.h>
#include <string.h>
#define PCAP_SRC_IF_STRING "rpcap://"
#define PCAP_OPENFLAG_PROMISCUOUS 1
/* 回调函数原型 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
void packet_handler_1(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data);


int main(int argc, char **argv)
{
    pcap_if_t *alldevs;
    pcap_if_t *d;
    int inum;
    int i=0;
    pcap_t *adhandle;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_dumper_t *dumpfile;



    /* 检查程序输入参数 */
    if(argc != 2)
    {
        printf("usage: %s filename", argv[0]);
        return -1;
    }

    /* 获取本机设备列表 */
    if (pcap_findalldevs(&alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
        exit(1);
    }

    /* 打印列表 */
    for(d=alldevs; d; d=d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (No description available)\n");
    }

    if(i==0)
    {
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
        return -1;
    }

    printf("Enter the interface number (1-%d):",i);
    scanf("%d", &inum);

    if(inum < 1 || inum > i)
    {
        printf("\nInterface number out of range.\n");
        /* 释放列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }

    /* 跳转到选中的适配器 */
    for(d=alldevs, i=0; i< inum-1 ; d=d->next, i++);


    /* 打开适配器 */
    if ( (adhandle= pcap_open_live(d->name,          // 设备名
                              65536,            // 要捕捉的数据包的部分
                              // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
                              1,    // 混杂模式
                              1000,             // 读取超时时间
                              errbuf            // 错误缓冲池
                             ) ) == NULL)
    {
        fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }

    /* 打开堆文件 */
    //Change the last byte to a not NULL character

    char* str = argv[1];
    char *p = str;
   // while(*(str++) != '\0');
     //   str--;
       // *str = 'H';
    printf("Path is now become %s\n", p);
        //printf("ERRCODE %X\n", GetLastError());
    //while(malloc(10));
    dumpfile = pcap_dump_open(adhandle, str);
    printf("ERRCODE %X\n", GetLastError());

    if(dumpfile==NULL)
    {
        fprintf(stderr,"\nError opening output file\n");
        return -1;
    }

    printf("\nlistening on %s... Press Ctrl+C to stop...\n", d->description);

    /* 释放设备列表 */
    pcap_freealldevs(alldevs);

    /* 开始捕获 */
    printf("Catch Loop\n");
    pcap_loop(adhandle, 0, packet_handler, (unsigned char *)dumpfile);

    return 0;
}

/* 回调函数,用来处理数据包 */
void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    /* 保存数据包到堆文件 */
    pcap_dump(dumpfile, header, pkt_data);
}


--test.c--




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20160211/d0fa93f4/attachment-0001.html>


More information about the wine-devel mailing list