BOOL EnumPortsW( LPWSTR pName, DWORD Level, LPBYTE pPorts, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned ) { PINIPORT pIniPort; DWORD cb; LPBYTE pEnd; DWORD LastError=0; EnterSplSem(); cb=0; pIniPort=pIniFirstPort; while (pIniPort) { cb+=GetPortSize(pIniPort, Level); pIniPort=pIniPort->pNext; } *pcbNeeded=cb; if (cb <= cbBuf) { pEnd=pPorts+cbBuf; *pcReturned=0; pIniPort=pIniFirstPort; while (pIniPort) { pEnd = CopyIniPortToPort(pIniPort, Level, pPorts, pEnd); switch (Level) { case 1: pPorts+=sizeof(PORT_INFO_1); break; } pIniPort=pIniPort->pNext; (*pcReturned)++; } } else LastError = ERROR_INSUFFICIENT_BUFFER; LeaveSplSem(); if (LastError) { SetLastError(LastError); return FALSE; } else return TRUE; }
BOOL EnumPorts( LPWSTR pName, DWORD Level, LPBYTE pPorts, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned ) { PINIPORT pIniPort; DWORD cb; LPBYTE pEnd; DWORD LastError=0; EnterSplSem(); cb=0; pIniPort=pIniFirstPort; while (pIniPort) { cb+=GetPortSize(pIniPort, Level); pIniPort=pIniPort->pNext; } *pcbNeeded=cb; if (cb <= cbBuf) { pEnd=pPorts+cbBuf; *pcReturned=0; pIniPort=pIniFirstPort; while (pIniPort) { if (!(pIniPort->Status & PP_FILEPORT)) { pEnd = CopyIniPortToPort(pIniPort, Level, pPorts, pEnd); switch (Level) { case 1: pPorts+=sizeof(PORT_INFO_1); break; case 2: pPorts+=sizeof(PORT_INFO_2); break; default: DBGMSG(DBG_ERROR, ("EnumPorts: invalid level %d", Level)); LastError = ERROR_INVALID_LEVEL; goto Cleanup; } (*pcReturned)++; } pIniPort=pIniPort->pNext; } } else LastError = ERROR_INSUFFICIENT_BUFFER; Cleanup: LeaveSplSem(); if (LastError) { SetLastError(LastError); return FALSE; } else return TRUE; }