/ source / tools / src / enumdisplay.cpp
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