enumdisplay.cpp
1 2 #include "compat.h" 3 4 #define NEED_DDRAW_H 5 #include "windows_inc.h" 6 7 #define DEFAULT_OUTPUT_FILE "enumdisplay.txt" 8 9 HMODULE hDDrawDLL = NULL; 10 LPDIRECTDRAW lpDD = NULL; 11 FILE *output = NULL; 12 13 void usage(void) 14 { 15 printf( 16 "enumdisplay by Jonathon Fowler (jf@jonof.id.au)\n" 17 "Options:\n" 18 " -h, -?, --help This message\n" 19 " -o <filename> Use different output file (default: " 20 DEFAULT_OUTPUT_FILE ", use - for stdout)\n" 21 ); 22 } 23 24 void dumpdevmode(DEVMODE *devmode) 25 { 26 fprintf(output, "\tdmFields has"); 27 if (devmode->dmFields & DM_PELSWIDTH) fprintf(output, " DM_PELSWIDTH"); 28 if (devmode->dmFields & DM_PELSHEIGHT) fprintf(output, " DM_PELSHEIGHT"); 29 if (devmode->dmFields & DM_BITSPERPEL) fprintf(output, " DM_BITSPERPEL"); 30 fprintf(output, "\n\tdmPelsWidth = %lu\n", devmode->dmPelsWidth); 31 fprintf(output, "\tdmPelsHeight = %lu\n", devmode->dmPelsHeight); 32 fprintf(output, "\tdmBitsPerPel = %lu\n", devmode->dmBitsPerPel); 33 } 34 35 HRESULT WINAPI ddenum(DDSURFACEDESC *ddsd, VOID *udata ATTRIBUTE((unused))) 36 { 37 fprintf(output, "\tdwFlags has"); 38 if (ddsd->dwFlags & DDSD_WIDTH) fprintf(output, " DDSD_WIDTH"); 39 if (ddsd->dwFlags & DDSD_HEIGHT) fprintf(output, " DDSD_HEIGHT"); 40 if (ddsd->dwFlags & DDSD_PIXELFORMAT) fprintf(output, " DDSD_PIXELFORMAT"); 41 fprintf(output, "\n\tdwWidth = %lu\n", ddsd->dwWidth); 42 fprintf(output, "\tdwHeight = %lu\n", ddsd->dwHeight); 43 fprintf(output, "\tddpfPixelFormat.dwFlags has"); 44 if (ddsd->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED1) fprintf(output, " DDPF_PALETTEINDEXED1"); 45 if (ddsd->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED2) fprintf(output, " DDPF_PALETTEINDEXED2"); 46 if (ddsd->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED4) fprintf(output, " DDPF_PALETTEINDEXED4"); 47 if (ddsd->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) fprintf(output, " DDPF_PALETTEINDEXED8"); 48 if (ddsd->ddpfPixelFormat.dwFlags & DDPF_RGB) fprintf(output, " DDPF_RGB"); 49 fprintf(output, "\n\tddpfPixelFormat.dwRGBBitCount = %lu\n", ddsd->ddpfPixelFormat.dwRGBBitCount); 50 fprintf(output, "\n"); 51 52 return(DDENUMRET_OK); 53 } 54 55 typedef HRESULT (WINAPI *aDirectDrawCreateType)(GUID *, LPDIRECTDRAW *, IUnknown *); 56 typedef HRESULT (WINAPI *aDirectDrawEnumerateType)(LPDDENUMCALLBACK, LPVOID); 57 58 int InitDirectDraw(void) 59 { 60 HRESULT result; 61 aDirectDrawCreateType aDirectDrawCreate; 62 aDirectDrawEnumerateType aDirectDrawEnumerate; 63 64 hDDrawDLL = LoadLibrary("DDRAW.DLL"); 65 if (!hDDrawDLL) { fprintf(output, "Failed loading DDRAW.DLL\n"); return -1; } 66 67 aDirectDrawEnumerate = (aDirectDrawEnumerateType)(void (*)(void))GetProcAddress(hDDrawDLL, "DirectDrawEnumerateA"); 68 if (!aDirectDrawEnumerate) { fprintf(output, "Error fetching DirectDrawEnumerate\n"); return -1; } 69 70 aDirectDrawCreate = (aDirectDrawCreateType)(void (*)(void))GetProcAddress(hDDrawDLL, "DirectDrawCreate"); 71 if (!aDirectDrawCreate) { fprintf(output, "Error fetching DirectDrawCreate\n"); return -1; } 72 73 result = aDirectDrawCreate(NULL, &lpDD, NULL); 74 if (result != DD_OK) { fprintf(output, "DirectDrawCreate() failed (%ld)\n", result); return -1; } 75 76 return 0; 77 } 78 79 void UninitDirectDraw(void) 80 { 81 if (lpDD) IDirectDraw_Release(lpDD); 82 lpDD = NULL; 83 if (hDDrawDLL) FreeLibrary(hDDrawDLL); 84 hDDrawDLL = NULL; 85 } 86 87 int main(int argc, char **argv) 88 { 89 char const * outputfile = DEFAULT_OUTPUT_FILE; 90 91 int i; 92 93 DEVMODE devmode; 94 HRESULT hresult; 95 96 for (i=1; i<argc; i++) { 97 if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "--help")) { 98 usage(); 99 return 0; 100 } else if (!strcmp(argv[i], "-o")) { 101 outputfile = argv[++i]; 102 } 103 } 104 105 if (!strcmp(outputfile, "-")) { 106 output = fdopen(1, "wt"); 107 outputfile = NULL; 108 } else { 109 output = fopen(outputfile, "wt"); 110 if (!output) { 111 fprintf(stderr, "enumdisplay: failed to open %s for output\n", outputfile); 112 return 1; 113 } 114 } 115 116 fprintf(output, 117 "enumdisplay results\n" 118 "\n" 119 "Display settings:\n" 120 ); 121 ZeroMemory(&devmode, sizeof(devmode)); 122 devmode.dmSize = sizeof(DEVMODE); 123 if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode)) { 124 fprintf(output, "\tEnumDisplaySettings() FAILED!\n"); 125 } else { 126 dumpdevmode(&devmode); 127 } 128 129 fprintf(output, 130 "\n" 131 "All modes from EnumDisplaySettings:\n" 132 ); 133 ZeroMemory(&devmode, sizeof(devmode)); 134 devmode.dmSize = sizeof(DEVMODE); 135 i = 0; 136 while (EnumDisplaySettings(NULL, i, &devmode)) { 137 dumpdevmode(&devmode); 138 fprintf(output, "\n"); 139 ZeroMemory(&devmode, sizeof(devmode)); 140 devmode.dmSize = sizeof(DEVMODE); 141 i++; 142 } 143 144 if (!InitDirectDraw()) { 145 fprintf(output, 146 "\n" 147 "All modes from IDirectDraw::EnumDisplayModes:\n" 148 ); 149 hresult = IDirectDraw_EnumDisplayModes(lpDD, 0, NULL, (LPVOID)0, ddenum); 150 if (hresult != DD_OK) { 151 fprintf(output, "\tIDirectDraw::EnumDisplayModes() FAILED! (%ld)\n", hresult); 152 } 153 } 154 UninitDirectDraw(); 155 156 if (outputfile) fclose(output); 157 158 return 0; 159 } 160