BUG: RasEnumEntries returns success regardless of buffer size (198801)



The information in this article applies to:

  • Microsoft Windows CE 2.0 for the Handheld PC
  • Microsoft Windows CE for the Handheld PC, Versions 1.0

This article was previously published under Q198801

SYMPTOMS

On Windows CE, RasEnumEntries is used to list all entry names in a remote access phone book. However, it returns 0 (success) even if you put a zero for the size of the input buffer parameter. The correct behavior should return ERROR_BUFFER_TOO_SMALL.

RESOLUTION

To work around the problem, we can pre-allocate a large buffer to receive phone book entries and use the out parameter "lpcEntries" to enumerate the phone book entries.

Following is sample code:
void OnRasenum()

{

    DWORD cb = 0;
    DWORD cEntries = 0;
    DWORD dwRet;
    DWORD i;
    TCHAR szBuf[1024];
    LPRASENTRYNAME lpRasEntryName = NULL;

    // Pre-alloate a sufficient large buffer for 10 phone book entries.
    lpRasEntryName = (LPRASENTRYNAME) LocalAlloc(LPTR, 10 *
                                                  sizeof(RASENTRYNAME));
    if (lpRasEntryName == NULL)
        return;
    lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
    cb = 10 * sizeof(RASENTRYNAME);

    dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &cb, &cEntries);
    if (dwRet == ERROR_BUFFER_TOO_SMALL)
    {
        LocalFree(lpRasEntryName);
        lpRasEntryName = NULL;
        lpRasEntryName = (LPRASENTRYNAME) LocalAlloc(LPTR, cb);
        if (lpRasEntryName == NULL)
            return;
        lpRasEntryName->dwSize = sizeof(RASENTRYNAME);

        if (RasEnumEntries(NULL, NULL, lpRasEntryName, &cb, &cEntries)
                                                                      != 0)
        {
            LocalFree(lpRasEntryName);
            return;
        }
    }
    else if (dwRet != 0)
    {
        LocalFree(lpRasEntryName);
        return;
    }


    // RasEnumEntries success

    wsprintf(szBuf, _T("Phone book entries [%d] in the default \ phonebook:"), cEntries);
    MessageBox(NULL, szBuf, _T("RasEnumEntries"), MB_OK);
    for(i=0;i < cEntries;i++)
    {
        wsprintf(szBuf, _T("%s"),lpRasEntryName->szEntryName);
        MessageBox(NULL, szBuf, _T("RasEnumEntries"), MB_OK);
        lpRasEntryName++;
    }
    if (lpRasEntryName)
        LocalFree(lpRasEntryName);
    return;

}

STATUS

Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the "Applies to" section.

Modification Type:MinorLast Reviewed:4/30/2004
Keywords:kbBug kbpending KB198801