#include #include #include // To Compile: gcc enumprt.c -lwinspool -o enumprt.exe // From: https://stackoverflow.com/questions/41147180/why-enumprintersa-and-enumprintersw-request-the-same-amount-of-memory typedef BOOL (__stdcall *EnumPrintersAFuncPtr)(DWORD Flags, LPSTR Name, DWORD Level, LPBYTE pPrinterEnum, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned); typedef BOOL (__stdcall *EnumPrintersWFuncPtr)(DWORD Flags, LPWSTR Name, DWORD Level, LPBYTE pPrinterEnum, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned); void testFunc() { PPRINTER_INFO_4A ppi4a = NULL; PPRINTER_INFO_4W ppi4w = NULL; BOOL resa, resw; DWORD neededa = 0, returneda = 0, neededw = 0, returnedw = 0, gle = 0, i = 0, flags = PRINTER_ENUM_LOCAL; LPBYTE bufa = NULL, bufw = NULL; resa = EnumPrintersA(flags, NULL, 4, NULL, 0, &neededa, &returneda); if (resa) { printf("EnumPrintersA(1) succeeded with NULL buffer. Exiting...\n"); return; } else { gle = GetLastError(); if (gle != ERROR_INSUFFICIENT_BUFFER) { printf("EnumPrintersA(1) failed with %d(0x%08X) which is different than %d. Exiting...\n", gle, gle, ERROR_INSUFFICIENT_BUFFER); return; } else { printf("EnumPrintersA(1) needs a %d(0x%08X) bytes long buffer.\n", neededa, neededa); } } resw = EnumPrintersW(flags, NULL, 4, NULL, 0, &neededw, &returnedw); if (resw) { printf("EnumPrintersW(1) succeeded with NULL buffer. Exiting...\n"); return; } else { gle = GetLastError(); if (gle != ERROR_INSUFFICIENT_BUFFER) { printf("EnumPrintersW(1) failed with %d(0x%08X) which is different than %d. Exiting...\n", gle, gle, ERROR_INSUFFICIENT_BUFFER); return; } else { printf("EnumPrintersW(1) needs a %d(0x%08X) bytes long buffer.\n", neededw, neededw); } } bufa = (LPBYTE)calloc(1, neededa); if (bufa == NULL) { printf("calloc failed with %d(0x%08X). Exiting...\n", errno, errno); free(bufa); return; } else { printf("buffera[0x%08X:0x%08X]\n", (long)bufa, (long)bufa + neededa - 1); } bufw = (LPBYTE)calloc(1, neededw); if (bufw == NULL) { printf("calloc failed with %d(0x%08X). Exiting...\n", errno, errno); free(bufw); return; } else { printf("bufferw[0x%08X:0x%08X]\n", (long)bufw, (long)bufw + neededw - 1); } resa = EnumPrintersA(flags, NULL, 4, bufa, neededa, &neededa, &returneda); if (!resa) { gle = GetLastError(); printf("EnumPrintersA(2) failed with %d(0x%08X). Exiting...\n", gle, gle); free(bufa); free(bufw); return; } printf("EnumPrintersA(2) copied %d bytes in the buffer out of which the first %d(0x%08X) represent %d structures of size %d\n", neededa, returneda * sizeof(PRINTER_INFO_4A), returneda * sizeof(PRINTER_INFO_4A), returneda, sizeof(PRINTER_INFO_4A)); resw = EnumPrintersW(flags, NULL, 4, bufw, neededw, &neededw, &returnedw); if (!resw) { gle = GetLastError(); printf("EnumPrintersW(2) failed with %d(0x%08X). Exiting...\n", gle, gle); free(bufw); free(bufa); return; } printf("EnumPrintersW(2) copied %d bytes in the buffer out of which the first %d(0x%08X) represent %d structures of size %d\n", neededw, returnedw * sizeof(PRINTER_INFO_4W), returnedw * sizeof(PRINTER_INFO_4W), returnedw, sizeof(PRINTER_INFO_4W)); ppi4a = (PPRINTER_INFO_4A)bufa; ppi4w = (PPRINTER_INFO_4W)bufw; printf("\nPrinting ASCII results:\n"); for (i = 0; i < returneda; i++) { printf(" Item %d\n pPrinterName: [%s]\n", i, ppi4a[i].pPrinterName ? ppi4a[i].pPrinterName : "NULL"); } printf("\nPrinting WIDE results:\n"); for (i = 0; i < returnedw; i++) { wprintf(L" Item %d\n pPrinterName: [%s]\n", i, ppi4w[i].pPrinterName ? ppi4w[i].pPrinterName : L"NULL"); } free(bufa); free(bufw); } int main() { testFunc(); printf("\nPress a key to exit...\n"); getch(); return 0; }