0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Windows下基于MSVC搭建Wintun開發(fā)環(huán)境

嵌入式USB開發(fā) ? 來(lái)源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-06-08 10:11 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注

Windows下基于MSVC搭建Wintun開發(fā)環(huán)境 (qq.com)

前言

l有這么一種場(chǎng)景,某個(gè)windows下的應(yīng)用程序底層數(shù)據(jù)接口基于以太網(wǎng),現(xiàn)在想修改為串口,那么一般來(lái)說(shuō)需要修改該應(yīng)用程序,添加對(duì)串口的支持,但是很多時(shí)候應(yīng)用程序可能是第三方開發(fā)的并不能修改,有沒(méi)有在不修改應(yīng)用程序的情況下實(shí)現(xiàn)兼容呢,

Wintun就提供了解決方案,Wintun可以創(chuàng)建虛擬網(wǎng)卡,提供IP層的數(shù)據(jù)鏈路,那么我們只需要使用Wintun創(chuàng)建虛擬網(wǎng)卡,將串口數(shù)據(jù)組包成指定協(xié)議層的包(UDP或者TCP/IP)等進(jìn)行轉(zhuǎn)發(fā),那么該應(yīng)用軟件可以訪問(wèn)該虛擬網(wǎng)卡,無(wú)需任何修改。

由于wintun工作在IP層,所以需要根據(jù)實(shí)際情況去實(shí)現(xiàn)UDP或者TCP/IP等包的組包和解包。

l還有一種場(chǎng)景,我們希望在windows下進(jìn)行嵌入式tcp/ip協(xié)議棧的源碼級(jí)別開發(fā)測(cè)試,那么就可以使用Wintun來(lái)模擬IP層的數(shù)據(jù)鏈路,而不直接訪問(wèn)真實(shí)的MAC和PHY,基于此進(jìn)行協(xié)議棧的開發(fā)調(diào)試,由于Wintun是IP層的,所以無(wú)法模擬數(shù)據(jù)鏈路層的部分,真實(shí)的場(chǎng)景是以太網(wǎng)控制器實(shí)現(xiàn)幀的收發(fā),而Wintun的是更上一層基于IP包的收發(fā),也就是從IP層截?cái)嗔?,所以不能進(jìn)行ARP等數(shù)據(jù)鏈路層的協(xié)議的分析調(diào)試。

準(zhǔn)備

官網(wǎng)

https://www.wintun.net/

下載代碼

git clone https://git.zx2c4.com/wintun

下載編譯好的庫(kù)

https://www.wintun.net/builds/wintun-0.14.1.zip

編譯庫(kù)

參考 https: / /git.zx2c4.com/wintun /about/#building

在自己的工程中使用

解壓wintun-0.14.1.zip復(fù)制文件夾wintun到自己的工程目錄

將下載的源碼wintun\\example下的example.c復(fù)制到自己的工程中。

右鍵點(diǎn)擊項(xiàng)目名->屬性 設(shè)置相關(guān)屬性,Window2和X86都同樣設(shè)置。

設(shè)置頭文件包含路徑

$(MSBuildProjectDirectory)\\Src\\wintun\\include;

圖片

設(shè)置鏈接的庫(kù)

iphlpapi.lib;kernel32.lib;ntdll.lib;ws2_32.lib;

圖片

設(shè)置輸出路徑

$(ProjectDir)$(Platform)\\$(Configuration)\\

圖片

切換X86和X64版本,都進(jìn)行編譯

圖片

點(diǎn)擊項(xiàng)目名->重新生成構(gòu)建。

將wintun\\bin\\amd64和wintun\\bin\\x86下的wintun.dll分別放入

工程的輸出目錄\\x64\\Debug和\\Win32\\Debug下

右鍵點(diǎn)擊exe文件,以管理員身份運(yùn)行(一定要管理員權(quán)限,否則出錯(cuò))

圖片

控制面板,網(wǎng)絡(luò)和共享中心,更改適配器設(shè)置,可以看到多了網(wǎng)卡Demo

圖片

命令行ipconfig可以看到

圖片

也可以ping通

圖片

基本API的使用

上面使用example進(jìn)行了測(cè)試,為了熟悉API,可以自己寫一個(gè)測(cè)試代碼。

參考https://git.zx2c4.com/wintun/about/

加載庫(kù),解析函數(shù)地址

LoadLibraryExW

GetProcAddress

先定義14個(gè)API函數(shù)的指針,

static WINTUN_CREATE_ADAPTER_FUNC *WintunCreateAdapter;


static WINTUN_CLOSE_ADAPTER_FUNC *WintunCloseAdapter;


static WINTUN_OPEN_ADAPTER_FUNC *WintunOpenAdapter;


static WINTUN_GET_ADAPTER_LUID_FUNC *WintunGetAdapterLUID;


static WINTUN_GET_RUNNING_DRIVER_VERSION_FUNC *WintunGetRunningDriverVersion;


static WINTUN_DELETE_DRIVER_FUNC *WintunDeleteDriver;


static WINTUN_SET_LOGGER_FUNC *WintunSetLogger;


static WINTUN_START_SESSION_FUNC *WintunStartSession;


static WINTUN_END_SESSION_FUNC *WintunEndSession;


static WINTUN_GET_READ_WAIT_EVENT_FUNC *WintunGetReadWaitEvent;


static WINTUN_RECEIVE_PACKET_FUNC *WintunReceivePacket;


static WINTUN_RELEASE_RECEIVE_PACKET_FUNC *WintunReleaseReceivePacket;


static WINTUN_ALLOCATE_SEND_PACKET_FUNC *WintunAllocateSendPacket;


static WINTUN_SEND_PACKET_FUNC *WintunSendPacket;

加載庫(kù)

HMODULE Wintun = LoadLibraryExW(L"wintun.dll", NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32);


if (!Wintun)


{


return -1;


}

解析函數(shù)地址,其他13個(gè)API類似

if ((*(FARPROC*)&WintunCreateAdapter = GetProcAddress(Wintun, "WintunCreateAdapter")) == NULL)


{


FreeLibrary(Wintun);


return -2;


}

以上為了方便理解分開了寫,example.c中用宏的形式更簡(jiǎn)潔。

創(chuàng)建適配器

GUID ExampleGuid = { 0xdeadbabe, 0xcafe, 0xbeef, { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef } };


WINTUN_ADAPTER_HANDLE Adapter = WintunCreateAdapter(L"Demo", L"Example", &ExampleGuid);


if (!Adapter)


{


FreeLibrary(Wintun);


return -3;


}

獲取版本

DWORD Version = WintunGetRunningDriverVersion();


printf("Wintun v%u.%u loaded", (Version > > 16) & 0xff, (Version > > 0) & 0xff);

啟動(dòng)會(huì)話

MIB_UNICASTIPADDRESS_ROW AddressRow;


InitializeUnicastIpAddressEntry(&AddressRow);              /* 單播IP地址 */


WintunGetAdapterLUID(Adapter, &AddressRow.InterfaceLuid);  /* 獲取LUID */


AddressRow.Address.Ipv4.sin_family = AF_INET;


AddressRow.Address.Ipv4.sin_addr.S_un.S_addr = htonl(ip);     /* IP地址  16進(jìn)制表示的xxx.xxx.xxx.xxx 高8位表示第一個(gè)xxx的16進(jìn)制值 */


AddressRow.OnLinkPrefixLength = 24;                           /* /24 網(wǎng)絡(luò),即子網(wǎng)掩碼為255.255.255.000 */


AddressRow.DadState = IpDadStatePreferred;


DWORD LastError = CreateUnicastIpAddressEntry(&AddressRow);


if (LastError != ERROR_SUCCESS && LastError != ERROR_OBJECT_ALREADY_EXISTS)


{


printf("Failed to set IP address %d", LastError);


WintunCloseAdapter(Adapter);


FreeLibrary(Wintun);


}


WINTUN_SESSION_HANDLE Session = WintunStartSession(Adapter, 0x400000);


if (!Session)


{


printf("Failed to create adapter");


WintunCloseAdapter(Adapter);


FreeLibrary(Wintun);


}

發(fā)送包

Wintun工作在第三層IP層,發(fā)送的是IP包。

BYTE* Packet = WintunAllocateSendPacket(Session, len); /* 先分配空間 */


if (Packet)


{


memcpy(Packet,buffer,len);


WintunSendPacket(Session, Packet);   /* Packet中包含了長(zhǎng)度信息,所以不需要再添加長(zhǎng)度 */


}

接收包

DWORD PacketSize;


BYTE* Packet = WintunReceivePacket(Session, &PacketSize);


if (Packet)


{


/* 使用接收到的數(shù)據(jù) */


/* 釋放 */


WintunReleaseReceivePacket(Session, Packet);


}

總結(jié)

Wintun提供了簡(jiǎn)潔的接口,在用戶空間即可創(chuàng)建虛擬網(wǎng)卡,進(jìn)行IP層的數(shù)據(jù)傳輸,基于此可以應(yīng)用于很多應(yīng)用場(chǎng)景,比如tcp/ip協(xié)議棧的移植,以太網(wǎng)和其他接口的轉(zhuǎn)換等。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18910

    瀏覽量

    300751
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3509

    瀏覽量

    88207
  • 開發(fā)環(huán)境
    +關(guān)注

    關(guān)注

    1

    文章

    215

    瀏覽量

    16549
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Windows基于MSVC搭建libuvc開發(fā)環(huán)境

    libuvc是基于libusb的跨平臺(tái)UVC庫(kù)。在Mac 和 Linux上可以直接構(gòu)建(使用cmake),也可以移植到Windows。
    的頭像 發(fā)表于 06-08 10:19 ?5711次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于<b class='flag-5'>MSVC</b><b class='flag-5'>搭建</b>libuvc<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建libjpeg開發(fā)環(huán)境

    Windows基于MSVC搭建libjpeg開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:23 ?1557次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于<b class='flag-5'>MSVC</b><b class='flag-5'>搭建</b>libjpeg<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建libusb開發(fā)環(huán)境

    Windows基于MSVC搭建libusb開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:25 ?2617次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于<b class='flag-5'>MSVC</b><b class='flag-5'>搭建</b>libusb<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建ffmpeg開發(fā)環(huán)境

    Windows基于MSVC搭建ffmpeg開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:27 ?1747次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于<b class='flag-5'>MSVC</b><b class='flag-5'>搭建</b>ffmpeg<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建SDL開發(fā)環(huán)境

    Windows基于MSVC搭建SDL開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:29 ?1464次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于<b class='flag-5'>MSVC</b><b class='flag-5'>搭建</b>SDL<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    Windows使用pthread-開發(fā)環(huán)境搭建

    Windows使用pthread-開發(fā)環(huán)境搭建
    的頭像 發(fā)表于 06-08 10:32 ?5434次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>使用pthread-<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>搭建</b>

    開發(fā)環(huán)境搭建教程

    android Windows系統(tǒng)開發(fā)環(huán)境搭建
    發(fā)表于 03-22 17:42 ?0次下載

    搭建C語(yǔ)言開發(fā)環(huán)境Windows平臺(tái))匯總

    本文給大家匯總了5種在WIN平臺(tái)下搭建C語(yǔ)言開發(fā)環(huán)境的方法,包括在Windows平臺(tái)配置GNU環(huán)境,使用Sublime Test
    的頭像 發(fā)表于 02-01 10:03 ?3671次閱讀

    php開發(fā)環(huán)境搭建和使用

    本文主要介紹的是php開發(fā)環(huán)境搭建和使用。apache在默認(rèn)情況下不會(huì)處理php頁(yè)面,Apache處理php頁(yè)面的步驟:即:php開發(fā)環(huán)境
    的頭像 發(fā)表于 02-01 15:26 ?3391次閱讀
    php<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>的<b class='flag-5'>搭建</b>和使用

    ESP32教程——Windows開發(fā)環(huán)境搭建.pdf下載

    ESP32教程——Windows開發(fā)環(huán)境搭建.pdf
    發(fā)表于 04-14 10:41 ?47次下載
    ESP32教程——<b class='flag-5'>Windows</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>搭建</b>.pdf下載

    如何在Windows系統(tǒng)安裝搭建PHP環(huán)境

    這兩天剛裝好Windows 7,碰巧前段時(shí)間有朋友問(wèn)我Windows 如何安裝搭建PHP 環(huán)境,所以打算勤勞
    發(fā)表于 08-09 16:56 ?13次下載

    MM32F013x——Windows環(huán)境基于Eclipse開發(fā)、調(diào)試MM32

    前面一章節(jié)介紹了在Windows搭建Eclipse開發(fā)環(huán)境,本章節(jié)將介紹在Windows
    發(fā)表于 01-25 18:53 ?2次下載
    MM32F013x——<b class='flag-5'>Windows</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>基于Eclipse<b class='flag-5'>開發(fā)</b>、調(diào)試MM32

    MM32F013x——Windows搭建Eclipse開發(fā)環(huán)境

    前段時(shí)間有客戶問(wèn)到如何在Windows環(huán)境基于Eclipse開發(fā)、調(diào)試MM32 MCU,經(jīng)過(guò)嘗試,現(xiàn)將環(huán)境
    發(fā)表于 01-25 18:58 ?2次下載
    MM32F013x——<b class='flag-5'>Windows</b><b class='flag-5'>下</b><b class='flag-5'>搭建</b>Eclipse<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    MM32F013x——Windows搭建Eclipse開發(fā)環(huán)境

    如何在Windows環(huán)境基于Eclipse開發(fā)、調(diào)試MM32 MCU,經(jīng)過(guò)嘗試,現(xiàn)將環(huán)境搭建
    發(fā)表于 02-08 16:27 ?1次下載
    MM32F013x——<b class='flag-5'>Windows</b><b class='flag-5'>下</b><b class='flag-5'>搭建</b>Eclipse<b class='flag-5'>開發(fā)</b><b class='flag-5'>環(huán)境</b>

    Windows搭建ARM11裸機(jī)開發(fā)環(huán)境:Eclipse創(chuàng)建工程

    上一篇文章介紹了在Windows搭建ARM11的裸機(jī)開發(fā)環(huán)境,需要的朋友可以過(guò)去看看。
    的頭像 發(fā)表于 04-08 09:36 ?1099次閱讀