日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Visual Studio 2013开发 mini-filter driver step by step 应用层与内核通讯(8)

發(fā)布時間:2025/3/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Visual Studio 2013开发 mini-filter driver step by step 应用层与内核通讯(8) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

應(yīng)用層與內(nèi)核通訊是通過通訊端口來進(jìn)行的,下面的這個API就是內(nèi)核用來創(chuàng)建一個內(nèi)核端口的。

NTSTATUS FltCreateCommunicationPort(_In_??????PFLT_FILTER Filter,_Out_?????PFLT_PORT *ServerPort,_In_??????POBJECT_ATTRIBUTES ObjectAttributes,_In_opt_??PVOID ServerPortCookie,_In_??????PFLT_CONNECT_NOTIFY ConnectNotifyCallback,_In_??????PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback,_In_opt_??PFLT_MESSAGE_NOTIFY MessageNotifyCallback,_In_??????LONG MaxConnections );


這里面有重要的三個回調(diào)函數(shù),ConnectNotifyCallback,DisconnectNotifyCallback,MessageNotifyCallback。

ConnectNotifyCallback

當(dāng)應(yīng)用層調(diào)用FilterConnectCommunicationPort 來與minifilter driver建立連接的時候,Filter Manager 會調(diào)用這個回調(diào)函數(shù)。

DisconnectNotifyCallback:

Pointer to a caller-supplied callback routine to be called whenever the user-mode handle count for the client port reaches zero or when the minifilter driver is about to be unloaded。

MessageNotifyCallback [in, optional]

The Filter Manager calls this routine, at IRQL?=?PASSIVE_LEVEL, whenever a user-mode application callsFilterSendMessage to send a message to the minifilter driver through the client port.

學(xué)習(xí)最有效,最快的方式不是看書和看文檔,而是實戰(zhàn),來看看示例代碼:

NTSTATUS
SSMFInitializeCommPort()
{
?NTSTATUS status = STATUS_SUCCESS;
?PSECURITY_DESCRIPTOR sd;
?OBJECT_ATTRIBUTES oa;
?UNICODE_STRING uniString;

?status = FltBuildDefaultSecurityDescriptor(&sd,
??FLT_PORT_ALL_ACCESS);

?if (!NT_SUCCESS(status))
?{
??return status;
?}

?RtlInitUnicodeString(&uniString, SSMF_PORT_NAME);

?InitializeObjectAttributes(&oa,
??&uniString,
??OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
??NULL,
??sd);

?status = FltCreateCommunicationPort(gFilterHandle,
??&gServerPort,
??&oa,
??NULL,
??SSMFConnect,
??SSMFDisconnect,
??SSMFMessage,
??1);

?FltFreeSecurityDescriptor(sd);

?return status;
}

這個SSMFInitializeCommPort函數(shù)就是創(chuàng)建了一個內(nèi)核端口供應(yīng)用層連接,當(dāng)然還有那三個重要的函數(shù)要實現(xiàn),在這里我們只是簡單的輸出一下log信息和返回一些簡單的數(shù)據(jù)。

NTSTATUS
SSMFConnect(
_In_ PFLT_PORT ClientPort,
_In_ PVOID ServerPortCookie,
_In_reads_bytes_(SizeOfContext) PVOID ConnectionContext,
_In_ ULONG SizeOfContext,
_Flt_ConnectionCookie_Outptr_ PVOID *ConnectionCookie
)

{

?PAGED_CODE();

?UNREFERENCED_PARAMETER(ServerPortCookie);
?UNREFERENCED_PARAMETER(ConnectionContext);
?UNREFERENCED_PARAMETER(SizeOfContext);
?UNREFERENCED_PARAMETER(ConnectionCookie);
?PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF!SSMFConnect entered"));

?gClientPort = ClientPort;
?return STATUS_SUCCESS;
}

VOID
SSMFDisconnect(
_In_opt_ PVOID ConnectionCookie
)
{

?PAGED_CODE();

?UNREFERENCED_PARAMETER(ConnectionCookie);

?//
?//? Close our handle
?//
?PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF!SSMFDisconnect entered"));

?FltCloseClientPort(gFilterHandle, &gClientPort);
}

NTSTATUS
SSMFMessage(
_In_ PVOID ConnectionCookie,
_In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer,
_In_ ULONG InputBufferSize,
_Out_writes_bytes_to_opt_(OutputBufferSize, *ReturnOutputBufferLength) PVOID OutputBuffer,
_In_ ULONG OutputBufferSize,
_Out_ PULONG ReturnOutputBufferLength
)
{
?
?NTSTATUS status = STATUS_SUCCESS;

?PAGED_CODE();

?UNREFERENCED_PARAMETER(ConnectionCookie);
?UNREFERENCED_PARAMETER(InputBuffer);
?UNREFERENCED_PARAMETER(OutputBuffer);
?UNREFERENCED_PARAMETER(OutputBufferSize);
?UNREFERENCED_PARAMETER(ReturnOutputBufferLength);
?UNREFERENCED_PARAMETER(InputBufferSize);
?if (InputBuffer)
?{
??char* data = (char*)InputBuffer;
??PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("The message data is %s",data));
?}
?if (OutputBuffer != NULL && OutputBufferSize > 4)
?{
??RtlCopyMemory(OutputBuffer, "1234", 4);
??*ReturnOutputBufferLength = 4;
?}

?PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF!SSMFMessage entered"));

?return status;
}

下面我們來看看應(yīng)用層怎么來與內(nèi)核通訊并且傳遞數(shù)據(jù):


HANDLE port = INVALID_HANDLE_VALUE;
?printf("Connecting to filter's port...\n");

?HRESULT hResult = FilterConnectCommunicationPort(SSMF_PORT_NAME,
??0,
??NULL,
??0,
??NULL,
??&port);
?if (hResult != S_OK)
?{
??return false;
?}
?printf("connected to the filter's port\n");
?//send message
?char buffer[100] = { 0 };
?strcpy_s(buffer, "abcdefg");
?char out_buf[100] = { 0 };
?DWORD ret_size = 0;
?hResult = FilterSendMessage(port, buffer, strlen(buffer), out_buf, 100, &ret_size);
?if (hResult == S_OK)
?{
??printf("The data is %s,len is %d\n", out_buf,ret_size);
?}
?CloseHandle(port);




總結(jié)

以上是生活随笔為你收集整理的Visual Studio 2013开发 mini-filter driver step by step 应用层与内核通讯(8)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本欧美亚洲 | 久久艹在线观看 | 老司机一区二区三区 | 高清日韩一区二区 | 免费毛片网站在线观看 | 天天操天天添 | 自拍亚洲综合 | 另类小说久久 | 91美女在线 | 亚洲狼人天堂 | 伊人首页| 国产调教视频在线观看 | 亚洲黄色在线视频 | 真实人妻互换毛片视频 | 欧美另类z0zx974 | 在线播放91灌醉迷j高跟美女 | 成人黄色短视频在线观看 | 美女爆乳18禁www久久久久久 | 肉色丝袜脚交一区二区 | 青青草视频国产 | 精品久久久一区 | 中文字幕第11页 | 中文国产字幕 | 99国产超薄肉色丝袜交足 | 老牛影视av一区二区在线观看 | 精品国产亚洲av麻豆 | 成人免费看av | 优优色影院 | 韩日精品视频 | √资源天堂中文在线 | 日韩欧美性视频 | 欧美成人影院 | 91视频社区 | 精品久久中文 | 欧美日韩一区二区区 | 91高潮大合集爽到抽搐 | 91蜜桃传媒精品久久久一区二区 | 97xxxxx| 精品一区二区在线播放 | 中文字幕91爱爱 | 草久影院| 99久99 | www.555国产精品免费 | 9l视频自拍九色9l视频 | 青青草av在线播放 | 超碰97人人射妻 | 天天干天天爽天天操 | 污视频在线网站 | 超碰公开免费 | 97超碰在线免费观看 | 精品国产免费一区二区三区 | 开心激情久久 | 久久亚洲一区二区 | 色播激情网 | 青娱乐在线免费观看 | 永久久久久久 | 欧美性猛交 xxxx | 欧美人与性动交α欧美精品 | www.色天使| 欧美日韩一区二区三区 | 国产视频在线免费观看 | 青青在线免费观看 | 91网站在线观看视频 | 一级黄色在线视频 | 国产美女特级嫩嫩嫩bbb | 性色视频在线观看 | 天天综合网永久 | 欧洲一区二区三区 | 亚洲激情视频一区 | 怡红院一区二区三区 | 色综合久久久久久久 | 午夜寂寞影视 | 欧美精品亚洲一区 | 国产对白videos麻豆高潮 | 欧美一级高清片 | 精品国产AV色欲天媒传媒 | 免费观看国产精品 | 亚洲一区激情 | 美国福利片 | 中文字幕在线播放 | 久久久综合久久久 | 亚洲熟妇av日韩熟妇在线 | 蜜臀精品一区二区三区 | 字幕网av | 免费成人美女女电影 | 国产精品国产三级国产三级人妇 | 亚洲精品二区三区 | а√天堂中文在线资源8 | 岛国av一区二区三区 | 精品视频免费看 | 九九热视频这里只有精品 | 国产浮力第一页 | 国产专区在线 | 日本女优中文字幕 | 亚洲免费网址 | 天天干夜夜玩 | 国产原创在线观看 | 免费精品视频在线 | 五月天综合|