LocalMon sampleに基づいてカスタムポートモニタを実装していますが、LcmEnumPorts
の実装から戻ったときに「データが無効です」というエラーが表示され、コンピュータにインストールされているポートの一覧が空です。モニターを取り外すとエラーが解消され、すべてのポートが再び表示されます。EnumPortsを呼び出した後、カスタムポートモニターで「データが無効です」というメッセージが表示されるのはなぜですか?
なぜ?私は戻ってくる構造が一貫しており、割り当てられたバッファーに収まることを確認しました。 LcmEnumPorts
の
実装例:それはどこでも文書化する表示されませんが
_Success_(return != FALSE)
BOOL WINAPI LcmEnumPorts(
_In_ HANDLE hMonitor,
_In_opt_ LPWSTR pName,
DWORD Level,
_Out_writes_bytes_opt_(cbBuf)
LPBYTE pPorts,
DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
)
{
UNREFERENCED_PARAMETER(pName);
UNREFERENCED_PARAMETER(hMonitor);
if (!pcbNeeded || !pcReturned || (!pPorts && (cbBuf > 0)))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
else if ((1 != Level) && (2 != Level))
{
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
}
const wchar_t szMonitorName[] = L"WDK Sample Port";
const wchar_t szPortName[] = L"NUL:";
size_t cbPortName = wcslen(szPortName) * sizeof(wchar_t) + sizeof(wchar_t);
size_t cbPortDesc = wcslen(szMonitorName) * sizeof(wchar_t) + sizeof(wchar_t);
size_t cbText = cbPortName + cbPortDesc;
size_t cbStruct = Level == 1 ? sizeof(PORT_INFO_1) : sizeof(PORT_INFO_2);
*pcbNeeded = (DWORD)(cbText + cbStruct);
*pcReturned = 0;
if (*pcbNeeded > cbBuf)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
if (Level == 1)
{
PPORT_INFO_1 pPort1 = (PPORT_INFO_1)pPorts;
LPWSTR pPortName = (LPWSTR)(pPorts + cbStruct);
StringCbCopy(pPortName, cbPortName, szPortName);
pPort1->pName = pPortName;
}
else if (Level == 2)
{
PPORT_INFO_2 pPort2 = (PPORT_INFO_2)pPorts;
LPWSTR pPortName = (LPWSTR)(pPorts + cbStruct);
StringCbCopy(pPortName, cbPortName, szPortName);
pPort2->pPortName = pPortName;
LPWSTR pPortDesc = (LPWSTR)(pPorts + cbStruct + cbPortName);
StringCbCopy(pPortDesc, cbPortDesc, szMonitorName);
pPort2->pMonitorName = pPortDesc;
pPort2->pDescription = pPortDesc;
pPort2->fPortType = PORT_TYPE_READ | PORT_TYPE_WRITE;
pPort2->Reserved = 0;
}
*pcReturned = 1;
return TRUE;
}
downvoterさんがコメントしますか?私はこの質問に対して何が嫌なのか分かりません。 – Mitch