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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OVERLAPPED结构与GetOverlappedResult函数

發(fā)布時間:2024/4/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OVERLAPPED结构与GetOverlappedResult函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

異步I/O調(diào)用時,我們會用到OVERLAPPED結(jié)構(gòu)和函數(shù)GetOverlappedResult。以前一直對GetOverlappedResult比較困惑,這兩天看書和代碼才知道這個函數(shù)的主要作用不過是將Overlapped返回的結(jié)果進行一次簡單的分析而已。

下面是OVERLAPPED的結(jié)構(gòu)定義:
typedef struct _OVERLAPPED {?
??? DWORD? Internal;?
??? DWORD? InternalHigh;?
??? DWORD? Offset;?
??? DWORD? OffsetHigh;?
??? HANDLE hEvent;?
} OVERLAPPED;?
這個結(jié)構(gòu)中Internal和InternalHigh是兩個返回值。寫過驅(qū)動程序的人知道這兩個值對應(yīng)著irp的IO_STATUS_BLOCK結(jié)構(gòu):
typedef struct _IO_STATUS_BLOCK {
??? union {
??????? NTSTATUS Status;
??????? PVOID Pointer;
??? };
??? ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

其中,Internal就是Status的值;InternalHigh就是Information的值。“Internal”這個單詞表明當初MS將這個兩個值就是內(nèi)部使用的。
而普通調(diào)用者如何知道其含義呢?
1.當調(diào)用返回時(用ReadFile舉例):
? 若Internal=0時表明返回STATUS_SUCCESS,于是ReadFile返回TRUE,即成功返回;InternalHigh的值保存在lpNumberOfBytesTransferred中。
? 若Internal!=0表示出現(xiàn)錯誤或PENDING,于是ReadFile返回FALSE, GetLastError值就是Internal值。

2.當1中返回ERROR_IO_PENDING時:
這個時候就需要用到GetOverlappedResult了。
? 若Internal=0時表明返回STATUS_SUCCESS,于是GetOverlappedResult返回TRUE,即成功返回;InternalHigh的值保存在lpNumberOfBytesTransferred中。
? 若Internal!=0表示出現(xiàn)錯誤,于是GetOverlappedResult返回FALSE, GetLastError值就是Internal值。


附源碼:
WINDOWS_2000_SOURCE_CODE\WIN2K\PRIVATE\windows\base\client\error.c

BOOL
WINAPI
GetOverlappedResult(
??? HANDLE hFile,
??? LPOVERLAPPED lpOverlapped,
??? LPDWORD lpNumberOfBytesTransferred,
??? BOOL bWait
??? )

/*++

Routine Description:

??? The?GetOverlappedResult?function returns the result of the last
??? operation that used lpOverlapped and returned ERROR_IO_PENDING.

Arguments:

??? hFile - Supplies the open handle to the file that the overlapped
??????? structure lpOverlapped was supplied to ReadFile, WriteFile,
??????? ConnectNamedPipe, WaitNamedPipe or TransactNamedPipe.

??? lpOverlapped - Points to an OVERLAPPED structure previously supplied to
??????? ReadFile, WriteFile, ConnectNamedPipe, WaitNamedPipe or
??????? TransactNamedPipe.
??????? //這個地址就是當初調(diào)用ReadFile是傳遞的參數(shù)的值,一定記住不能錯。

??? lpNumberOfBytesTransferred - Returns the number of bytes transferred
??????? by the operation.

??? bWait -? A boolean value that affects the behavior when the operation
??????? is still in progress. If TRUE and the operation is still in progress,
????????GetOverlappedResult?will wait for the operation to complete before
??????? returning. If FALSE and the operation is incomplete,
????????GetOverlappedResult?will return FALSE. In this case the extended
??????? error information available from the GetLastError function will be
??????? set to ERROR_IO_INCOMPLETE.
??????? //若當前還是ERROR_IO_PENDING則判斷是否需要無限期的等待。

Return Value:

??? TRUE -- The operation was successful, the pipe is in the
??????? connected state.

??? FALSE -- The operation failed. Extended error status is available using
??????? GetLastError.

--*/

[html]?view plaincopy print?
  • {??
  • ????DWORD?WaitReturn;??
  • ??
  • ????//??
  • ????//?Did?caller?specify?an?event?to?the?original?operation?or?was?the??
  • ????//?default?(file?handle)?used???
  • ????//??
  • ??
  • ????if?(lpOverlapped->Internal?==?(DWORD)STATUS_PENDING?)?{??
  • ????????if?(?bWait?)?{??
  • ????????????//??
  • ????????????//現(xiàn)在還是PENDING,且還需要等待,則無限期等待。??
  • ????????????//很多人會自己調(diào)用WaitForSingleObject后再調(diào)用GetOverlappedResult,其實看起來??
  • ????????????//沒多少必要。??
  • ????????????//??
  • ????????????WaitReturn?=?WaitForSingleObject(??
  • ????????????????????????????(?lpOverlapped->hEvent?!=?NULL?)????
  • ????????????????????????????????lpOverlapped->hEvent?:?hFile,??
  • ????????????????????????????INFINITE??
  • ????????????????????????????);??
  • ????????????}??
  • ????????else?{??
  • ????????????WaitReturn?=?WAIT_TIMEOUT;??
  • ????????????}??
  • ??
  • ????????if?(?WaitReturn?==?WAIT_TIMEOUT?)?{??
  • ????????????//??!bWait?and?event?in?not?signalled?state??
  • ????????????SetLastError(?ERROR_IO_INCOMPLETE?);??
  • ????????????return?FALSE;??
  • ????????????}??
  • ??
  • ????????if?(?WaitReturn?!=?0?)?{??
  • ?????????????return?FALSE;????//?WaitForSingleObject?calls?BaseSetLastError??
  • ?????????????}??
  • ????????}??
  • ??
  • ????*lpNumberOfBytesTransferred?=?(DWORD)lpOverlapped->InternalHigh;??
  • ??
  • ????if?(?NT_SUCCESS((NTSTATUS)lpOverlapped->Internal)?){??
  • ????????return?TRUE;??
  • ????????}??
  • ????else?{??
  • ????????BaseSetLastNTError(?(NTSTATUS)lpOverlapped->Internal?);??
  • ????????return?FALSE;??
  • ????????}??
  • }??

  • 補充:(2009-10-8)

    《windows核心編程》(5th版),p293.

    ---------------

    Internal成員:這個成員用來保存已處理的I/O請求的錯誤碼.

    InternalHigh成員:當異步I/O請求完成的時候,這個成員用來保存已傳輸?shù)淖止?jié)數(shù)。

    在當初設(shè)計OVERLAPPED結(jié)構(gòu)的時候,Microsoft決定不公開Internal和InternalHigh成員(名副其實)。隨著時間的推移,Microsoft認識到這些成員包含的信息會對開發(fā)人員有用,因此把它們公開了。但是,Microsoft沒有改變這些成員的名字,這是因為操作系統(tǒng)的源代碼頻繁地用到它們,而Microsoft并不想為此修改源代碼。

    -------

    由于Microsoft公開了這些成員,所以我們看到并不一定需要GetOverLappedResult了。:)

    轉(zhuǎn)載于:https://www.cnblogs.com/Little-Star/p/7413199.html

    與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的OVERLAPPED结构与GetOverlappedResult函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 免费在线观看黄视频 | 少妇太紧太爽又黄又硬又爽 | 国产99在线播放 | 黄色男女网站 | 免费成人小视频 | 久久99精品久久久水蜜桃 | 拍真实国产伦偷精品 | 成人快手免费看片 | 男人添女人荫蒂国产 | 看片久久| 免费簧片在线观看 | 丰满少妇被猛烈进入无码 | 香蕉茄子视频 | 在线超碰 | 天堂网一区 | 日韩欧美综合视频 | 亚洲免费在线观看av | 一区免费视频 | a猛片 | 超碰999| 强侵犯の奶水授乳羞羞漫虐 | 特黄网站 | 欧美一区欧美二区 | 午夜剧场欧美 | 亚洲av日韩精品久久久久久久 | 欧洲视频一区二区 | 疯狂少妇 | 乳罩脱了喂男人吃奶视频 | 日韩不卡一二区 | 网红日批视频 | 91久久国产精品 | 大地资源中文在线观看免费版 | 视频一区二区三区在线观看 | 午夜美女福利视频 | 日韩欧美大片在线观看 | 国产高清一| 久久艹精品| 一个人看的毛片 | 四虎在线影院 | 欧美成网| 精品国产乱码久久久久久蜜臀网站 | 黄色av网站免费 | 在线观看你懂的网址 | 一区二区三区日韩在线 | 黄色av网站免费观看 | 九九在线观看高清免费 | 婷婷五月色综合 | 香港三级日本三级韩国三级 | 午夜资源 | 国产一二三区免费视频 | 亚洲天堂av网站 | 人人插人人看 | 天天天天干 | 国产99视频在线 | 久久国产精品系列 | 久久亚洲精精品中文字幕早川悠里 | 免费看特级毛片 | 性渴老太作爱 | 久久7777 | 日本一区二区三区在线视频 | 91免费在线视频 | 亚洲国产精彩视频 | 国产小视频在线观看 | 国产黄色网页 | 亚洲中文字幕无码一区 | 久久久极品| 一级视频毛片 | 国产91在线高潮白浆在线观看 | 国产午夜激情视频 | 亚洲精品国产精品国自产观看浪潮 | 伊人手机在线视频 | 亚洲精品97久久中文字幕 | 亚洲视频一区二区在线观看 | 插插操操| 午夜免费福利 | 97影院手机版 | 秋霞成人午夜鲁丝一区二区三区 | 在线中文视频 | 国产欧美日 | 欧美丰满老熟妇aaaa片 | av尤物在线| 国产免费av一区二区三区 | 欧美乱妇高清无乱码 | 亚洲精品黄色 | 波多野结衣亚洲天堂 | av无码精品一区二区三区宅噜噜 | 久久裸体视频 | 亚洲国产一区二区三区 | 欧美日韩在线视频播放 | 在线色综合 | 精品二区视频 | 国产91区 | 亚州国产 | 最新黄色网页 | 国产小视频你懂的 | 国产特黄毛片 | 青春草久久 | 久久久噜噜噜久久 | 久久99精品久久久久久 |