home *** CD-ROM | disk | FTP | other *** search
/ The Net: Ultimate Internet Guide / WWLCD1.ISO / pc / directx2 / sdk / samples / dxview / dxview.c next >
Encoding:
C/C++ Source or Header  |  1996-05-28  |  82.7 KB  |  1,838 lines

  1. /****************************************************************************
  2.  
  3.     Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
  4.  
  5.     PROGRAM: dxview.c
  6.  
  7.     PURPOSE: DirectX Device Viewer
  8.  
  9.     FUNCTIONS:
  10.  
  11.     COMMENTS:
  12.  
  13. ****************************************************************************/
  14.  
  15. #include <windows.h>
  16. #include <windowsx.h>
  17. #include <mmsystem.h>
  18. #include <commctrl.h>
  19.  
  20. #define INITGUID
  21. #include <objbase.h>
  22. #include <initguid.h>
  23.  
  24. #include <ddraw.h>
  25. //#include <mmreg.h>
  26. #include <dsound.h>
  27. #include <dplay.h>
  28. #include <d3d.h>
  29. #include "dxview.h"
  30.  
  31. /****************************************************************************
  32.  ***************************************************************************/
  33.  
  34. HINSTANCE   g_hInstance;
  35. char        g_szAppName[]   = "DXView";
  36. char        g_szClassName[] = "DXView";
  37. char        g_szTitle[]     = "DirectX Device Viewer";
  38. HWND        g_hwndMain;
  39.  
  40. HWND        g_hwndLV;        // List view
  41. HWND        g_hwndTV;        // Tree view
  42. HIMAGELIST  g_hImageList;
  43. HFONT       g_hFont;
  44. int         g_xPaneSplit;
  45. int         g_xHalfSplitWidth;
  46. BOOL        g_bSplitMove;
  47. DWORD       g_dwViewState;
  48. DWORD       g_tmAveCharWidth;
  49.  
  50. /****************************************************************************
  51.  ***************************************************************************/
  52.  
  53. IDirectDraw *lpDD;          // DirectDraw object
  54. GUID *       ddid;
  55.  
  56. IDirectSound *lpDS;         // DirectSound object
  57. GUID *       dsid;
  58.  
  59. IDirectPlay  *lpDP;         // DirectPlay object
  60. GUID *       dpid;
  61.  
  62. IDirect3D    *lp3D;          // Direct3D object
  63. GUID *       d3did;
  64.  
  65. IDirect3DDevice *lp3DDevice;
  66. GUID *pid_for3D = 0;
  67.  
  68.  
  69. /****************************************************************************
  70.  ***************************************************************************/
  71.  
  72. #define DDCAPDEF(name,val,flag) {name, FIELD_OFFSET(DDCAPS,val), flag}
  73. #define DDVALDEF(name,val)      {name, FIELD_OFFSET(DDCAPS,val), 0}
  74. #define ROPDEF(name,rop)        DDCAPDEF(name,dwRops[((rop>>16)&0xFF)/32],(1<<((rop>>16)&0xFF)%32))
  75.  
  76. #define DSCAPDEF(name,val,flag) {name, FIELD_OFFSET(DSCAPS,val), flag}
  77. #define DSVALDEF(name,val)      {name, FIELD_OFFSET(DSCAPS,val), 0}
  78.  
  79. #define DPCAPDEF(name,val,flag) {name, FIELD_OFFSET(DPCAPS,val), flag}
  80. #define DPVALDEF(name,val)      {name, FIELD_OFFSET(DPCAPS,val), 0}
  81.  
  82. #define D3CAPDEF(name,val,flag) {name, FIELD_OFFSET(D3DDEVICEDESC,val), flag}
  83. #define D3VALDEF(name,val)      {name, FIELD_OFFSET(D3DDEVICEDESC,val), 0}
  84.  
  85. #define SURFCAPDEF(name,val,flag) {name, FIELD_OFFSET(DDSURFACEDESC,val), flag}
  86. #define SURFVALDEF(name,val)      {name, FIELD_OFFSET(DDSURFACEDESC,val), 0}
  87.  
  88. #define MAKEMODE(xres,yres,bpp) (((DWORD)xres << 20) | ((DWORD)yres << 8) | bpp)
  89. #define GETXRES(mode)           (int)((mode >> 20) & 0x0FFF)
  90. #define GETYRES(mode)           (int)((mode >> 8)  & 0x0FFF)
  91. #define GETCRES(mode)           (int)((mode >> 0)  & 0x00FF)
  92.  
  93. /****************************************************************************
  94.  ***************************************************************************/
  95. CAPDEF OtherInfoDefs[] =
  96. {
  97.     DDVALDEF("VidMemTotal",                   dwVidMemTotal),
  98.     DDVALDEF("VidMemFree",                    dwVidMemFree),
  99.     DDVALDEF("dwReserved1",                   dwReserved1),
  100.     DDVALDEF("dwReserved2",                   dwReserved2),
  101.     DDVALDEF("dwReserved3",                   dwReserved3),
  102.     DDVALDEF("AlphaBltConstBitDepths",        dwAlphaBltConstBitDepths),
  103.     DDVALDEF("AlphaBltPixelBitDepths",        dwAlphaBltPixelBitDepths),
  104.     DDVALDEF("AlphaBltSurfaceBitDepths",      dwAlphaBltSurfaceBitDepths),
  105.     DDVALDEF("AlphaOverlayConstBitDepths",    dwAlphaOverlayConstBitDepths),
  106.     DDVALDEF("AlphaOverlayPixelBitDepths",    dwAlphaOverlayPixelBitDepths),
  107.     DDVALDEF("AlphaOverlaySurfaceBitDepths",  dwAlphaOverlaySurfaceBitDepths),
  108.     DDVALDEF("ZBufferBitDepths",              dwZBufferBitDepths),
  109.     DDVALDEF("MaxVisibleOverlays",            dwMaxVisibleOverlays),
  110.     DDVALDEF("CurrVisibleOverlays",           dwCurrVisibleOverlays),
  111.     DDVALDEF("NumFourCCCodes",                dwNumFourCCCodes),
  112.     DDVALDEF("AlignBoundarySrc",              dwAlignBoundarySrc),
  113.     DDVALDEF("AlignSizeSrc",                  dwAlignSizeSrc),
  114.     DDVALDEF("AlignBoundaryDest",             dwAlignBoundaryDest),
  115.     DDVALDEF("AlignSizeDest",                 dwAlignSizeDest),
  116.     DDVALDEF("AlignStrideAlign",              dwAlignStrideAlign),
  117.     DDVALDEF("MinOverlayStretch",             dwMinOverlayStretch),
  118.     DDVALDEF("MaxOverlayStretch",             dwMaxOverlayStretch),
  119.     DDVALDEF("MinLiveVideoStretch",           dwMinLiveVideoStretch),
  120.     DDVALDEF("MaxLiveVideoStretch",           dwMaxLiveVideoStretch),
  121.     DDVALDEF("MinHwCodecStretch",             dwMinHwCodecStretch),
  122.     DDVALDEF("MaxHwCodecStretch",             dwMaxHwCodecStretch),
  123.     { "", 0, 0 }
  124. };
  125.  
  126. /****************************************************************************
  127.  ***************************************************************************/
  128. CAPDEF CapsDefs[] =
  129. {
  130.     DDCAPDEF("3D",                        dwCaps, DDCAPS_3D),
  131.     DDCAPDEF("ALIGNBOUNDARYDEST",         dwCaps, DDCAPS_ALIGNBOUNDARYDEST),
  132.     DDCAPDEF("ALIGNSIZEDEST",             dwCaps, DDCAPS_ALIGNSIZEDEST),
  133.     DDCAPDEF("ALIGNBOUNDARYSRC",          dwCaps, DDCAPS_ALIGNBOUNDARYSRC),
  134.     DDCAPDEF("ALIGNSIZESRC",              dwCaps, DDCAPS_ALIGNSIZESRC),
  135.     DDCAPDEF("ALIGNSTRIDE",               dwCaps, DDCAPS_ALIGNSTRIDE),
  136.     DDCAPDEF("BLT",                       dwCaps, DDCAPS_BLT),
  137.     DDCAPDEF("BLTCOLORFILL",              dwCaps, DDCAPS_BLTCOLORFILL),
  138.     DDCAPDEF("BLTDEPTHFILL",              dwCaps, DDCAPS_BLTDEPTHFILL),
  139.     DDCAPDEF("BLTFOURCC",                 dwCaps, DDCAPS_BLTFOURCC),
  140.     DDCAPDEF("BLTSTRETCH",                dwCaps, DDCAPS_BLTSTRETCH),
  141.     DDCAPDEF("BLTQUEUE",                  dwCaps, DDCAPS_BLTQUEUE),
  142.     DDCAPDEF("GDI",                       dwCaps, DDCAPS_GDI),
  143.     DDCAPDEF("OVERLAY",                   dwCaps, DDCAPS_OVERLAY),
  144.     DDCAPDEF("OVERLAYCANTCLIP",           dwCaps, DDCAPS_OVERLAYCANTCLIP),
  145.     DDCAPDEF("OVERLAYFOURCC",             dwCaps, DDCAPS_OVERLAYFOURCC),
  146.     DDCAPDEF("OVERLAYSTRETCH",            dwCaps, DDCAPS_OVERLAYSTRETCH),
  147.     DDCAPDEF("PALETTE",                   dwCaps, DDCAPS_PALETTE),
  148.     DDCAPDEF("PALETTEVSYNC",              dwCaps, DDCAPS_PALETTEVSYNC),
  149.     DDCAPDEF("READSCANLINE",              dwCaps, DDCAPS_READSCANLINE),
  150.     DDCAPDEF("STEREOVIEW",                dwCaps, DDCAPS_STEREOVIEW),
  151.     DDCAPDEF("VBI",                       dwCaps, DDCAPS_VBI),
  152.     DDCAPDEF("ZBLTS",                     dwCaps, DDCAPS_ZBLTS),
  153.     DDCAPDEF("ZOVERLAYS",                 dwCaps, DDCAPS_ZOVERLAYS),
  154.     DDCAPDEF("COLORKEY",                  dwCaps, DDCAPS_COLORKEY),
  155.     DDCAPDEF("ALPHA",                     dwCaps, DDCAPS_ALPHA),
  156.     DDCAPDEF("CKEYHWASSIST",              dwCaps, DDCAPS_COLORKEYHWASSIST),
  157.     DDCAPDEF("NOHARDWARE",                dwCaps, DDCAPS_NOHARDWARE),
  158.     DDCAPDEF("BANKSWITCHED",              dwCaps, DDCAPS_BANKSWITCHED),
  159.     DDCAPDEF("CERTIFIED",                 dwCaps2,DDCAPS2_CERTIFIED),
  160.     DDCAPDEF("NO2DDURING3DSCENE",                 dwCaps2,DDCAPS2_NO2DDURING3DSCENE),
  161.     { "", 0, 0 }
  162. };
  163.  
  164. /****************************************************************************
  165.  ***************************************************************************/
  166. CAPDEF CKeyCapsDefs[] =
  167. {
  168.     DDCAPDEF("DESTBLT",                   dwCKeyCaps, DDCKEYCAPS_DESTBLT),
  169.     DDCAPDEF("DESTBLTCLRSPACE",           dwCKeyCaps, DDCKEYCAPS_DESTBLTCLRSPACE),
  170.     DDCAPDEF("DESTBLTCLRSPACEYUV",        dwCKeyCaps, DDCKEYCAPS_DESTBLTCLRSPACEYUV),
  171.     DDCAPDEF("DESTBLTYUV",                dwCKeyCaps, DDCKEYCAPS_DESTBLTYUV),
  172.     DDCAPDEF("DESTOVERLAY",               dwCKeyCaps, DDCKEYCAPS_DESTOVERLAY),
  173.     DDCAPDEF("DESTOVERLAYCLRSPACE",       dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYCLRSPACE),
  174.     DDCAPDEF("DESTOVERLAYCLRSPACEYUV",    dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV),
  175.     DDCAPDEF("DESTOVERLAYONEACTIVE",      dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYONEACTIVE),
  176.     DDCAPDEF("DESTOVERLAYYUV",            dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYYUV),
  177.     DDCAPDEF("SRCBLT",                    dwCKeyCaps, DDCKEYCAPS_SRCBLT),
  178.     DDCAPDEF("SRCBLTCLRSPACE",            dwCKeyCaps, DDCKEYCAPS_SRCBLTCLRSPACE),
  179.     DDCAPDEF("SRCBLTCLRSPACEYUV",         dwCKeyCaps, DDCKEYCAPS_SRCBLTCLRSPACEYUV),
  180.     DDCAPDEF("SRCBLTYUV",                 dwCKeyCaps, DDCKEYCAPS_SRCBLTYUV),
  181.     DDCAPDEF("SRCOVERLAY",                dwCKeyCaps, DDCKEYCAPS_SRCOVERLAY),
  182.     DDCAPDEF("SRCOVERLAYCLRSPACE",        dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYCLRSPACE),
  183.     DDCAPDEF("SRCOVERLAYCLRSPACEYUV",     dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV),
  184.     DDCAPDEF("SRCOVERLAYONEACTIVE",       dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYONEACTIVE),
  185.     DDCAPDEF("SRCOVERLAYYUV",             dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYYUV),
  186.     { "", 0, 0}
  187. };
  188.  
  189. /****************************************************************************
  190.  ***************************************************************************/
  191. CAPDEF FXCapsDefs[] =
  192. {
  193.     DDCAPDEF("BLTARITHSTRETCHY",          dwFXCaps, DDFXCAPS_BLTARITHSTRETCHY),
  194.     DDCAPDEF("BLTARITHSTRETCHYN",         dwFXCaps, DDFXCAPS_BLTARITHSTRETCHYN),
  195.     DDCAPDEF("BLTMIRRORLEFTRIGHT",        dwFXCaps, DDFXCAPS_BLTMIRRORLEFTRIGHT),
  196.     DDCAPDEF("BLTMIRRORUPDOWN",           dwFXCaps, DDFXCAPS_BLTMIRRORUPDOWN),
  197.     DDCAPDEF("BLTROTATION",               dwFXCaps, DDFXCAPS_BLTROTATION),
  198.     DDCAPDEF("BLTROTATION90",             dwFXCaps, DDFXCAPS_BLTROTATION90),
  199.     DDCAPDEF("BLTSHRINKX",                dwFXCaps, DDFXCAPS_BLTSHRINKX),
  200.     DDCAPDEF("BLTSHRINKXN",               dwFXCaps, DDFXCAPS_BLTSHRINKXN),
  201.     DDCAPDEF("BLTSHRINKY",                dwFXCaps, DDFXCAPS_BLTSHRINKY),
  202.     DDCAPDEF("BLTSHRINKYN",               dwFXCaps, DDFXCAPS_BLTSHRINKYN),
  203.     DDCAPDEF("BLTSTRETCHX",               dwFXCaps, DDFXCAPS_BLTSTRETCHX),
  204.     DDCAPDEF("BLTSTRETCHXN",              dwFXCaps, DDFXCAPS_BLTSTRETCHXN),
  205.     DDCAPDEF("BLTSTRETCHY",               dwFXCaps, DDFXCAPS_BLTSTRETCHY),
  206.     DDCAPDEF("BLTSTRETCHYN",              dwFXCaps, DDFXCAPS_BLTSTRETCHYN),
  207.     DDCAPDEF("OVERLAYARITHSTRETCHY",      dwFXCaps, DDFXCAPS_OVERLAYARITHSTRETCHY),
  208.     DDCAPDEF("OVERLAYARITHSTRETCHYN",     dwFXCaps, DDFXCAPS_OVERLAYARITHSTRETCHYN),
  209.     DDCAPDEF("OVERLAYSHRINKX",            dwFXCaps, DDFXCAPS_OVERLAYSHRINKX),
  210.     DDCAPDEF("OVERLAYSHRINKXN",           dwFXCaps, DDFXCAPS_OVERLAYSHRINKXN),
  211.     DDCAPDEF("OVERLAYSHRINKY",            dwFXCaps, DDFXCAPS_OVERLAYSHRINKY),
  212.     DDCAPDEF("OVERLAYSHRINKYN",           dwFXCaps, DDFXCAPS_OVERLAYSHRINKYN),
  213.     DDCAPDEF("OVERLAYSTRETCHX",           dwFXCaps, DDFXCAPS_OVERLAYSTRETCHX),
  214.     DDCAPDEF("OVERLAYSTRETCHXN",          dwFXCaps, DDFXCAPS_OVERLAYSTRETCHXN),
  215.     DDCAPDEF("OVERLAYSTRETCHY",           dwFXCaps, DDFXCAPS_OVERLAYSTRETCHY),
  216.     DDCAPDEF("OVERLAYSTRETCHYN",          dwFXCaps, DDFXCAPS_OVERLAYSTRETCHYN),
  217.     DDCAPDEF("OVERLAYMIRRORLEFTRIGHT",    dwFXCaps, DDFXCAPS_OVERLAYMIRRORLEFTRIGHT),
  218.     DDCAPDEF("OVERLAYMIRRORUPDOWN",       dwFXCaps, DDFXCAPS_OVERLAYMIRRORUPDOWN),
  219.     { "", 0, 0}
  220. };
  221.  
  222. /****************************************************************************
  223.  ***************************************************************************/
  224. CAPDEF PalCapsDefs[] =
  225. {
  226.     DDCAPDEF("4BIT",              dwPalCaps, DDPCAPS_4BIT),
  227.     DDCAPDEF("8BITENTRIES",       dwPalCaps, DDPCAPS_8BITENTRIES),
  228.     DDCAPDEF("8BIT",              dwPalCaps, DDPCAPS_8BIT),
  229.     DDCAPDEF("INITIALIZE",        dwPalCaps, DDPCAPS_INITIALIZE),
  230.     DDCAPDEF("PRIMARYSURFACE",    dwPalCaps, DDPCAPS_PRIMARYSURFACE),
  231.     DDCAPDEF("PRIMARYSURFACELEFT",dwPalCaps, DDPCAPS_PRIMARYSURFACELEFT),
  232.     DDCAPDEF("VSYNC",             dwPalCaps, DDPCAPS_VSYNC),
  233.     { "", 0, 0}
  234. };
  235.  
  236. /****************************************************************************
  237.  ***************************************************************************/
  238. CAPDEF SurfCapsDefs[] =
  239. {
  240.     DDCAPDEF( "3D",                   ddsCaps.dwCaps, DDSCAPS_3D),
  241.     DDCAPDEF( "3DDEVICE",             ddsCaps.dwCaps, DDSCAPS_3DDEVICE),
  242.     DDCAPDEF( "ALPHA",                ddsCaps.dwCaps, DDSCAPS_ALPHA),
  243.     DDCAPDEF( "BACKBUFFER",           ddsCaps.dwCaps, DDSCAPS_BACKBUFFER),
  244.     DDCAPDEF( "COMPLEX",              ddsCaps.dwCaps, DDSCAPS_COMPLEX),
  245.     DDCAPDEF( "FLIP",                 ddsCaps.dwCaps, DDSCAPS_FLIP),
  246.     DDCAPDEF( "FRONTBUFFER",          ddsCaps.dwCaps, DDSCAPS_FRONTBUFFER),
  247.     DDCAPDEF( "MIPMAP",               ddsCaps.dwCaps, DDSCAPS_MIPMAP),
  248.     DDCAPDEF( "OFFSCREENPLAIN",       ddsCaps.dwCaps, DDSCAPS_OFFSCREENPLAIN),
  249.     DDCAPDEF( "OVERLAY",              ddsCaps.dwCaps, DDSCAPS_OVERLAY),
  250.     DDCAPDEF( "PALETTE",              ddsCaps.dwCaps, DDSCAPS_PALETTE),
  251.     DDCAPDEF( "PRIMARYSURFACE",       ddsCaps.dwCaps, DDSCAPS_PRIMARYSURFACE),
  252.     DDCAPDEF( "PRIMARYSURFACELEFT",   ddsCaps.dwCaps, DDSCAPS_PRIMARYSURFACELEFT),
  253.     DDCAPDEF( "SYSTEMMEMORY",         ddsCaps.dwCaps, DDSCAPS_SYSTEMMEMORY),
  254.     DDCAPDEF( "TEXTURE",              ddsCaps.dwCaps, DDSCAPS_TEXTURE),
  255.     DDCAPDEF( "VIDEOMEMORY",          ddsCaps.dwCaps, DDSCAPS_VIDEOMEMORY),
  256.     DDCAPDEF( "VISIBLE",              ddsCaps.dwCaps, DDSCAPS_VISIBLE),
  257.     DDCAPDEF( "WRITEONLY",            ddsCaps.dwCaps, DDSCAPS_WRITEONLY),
  258.     DDCAPDEF( "ZBUFFER",              ddsCaps.dwCaps, DDSCAPS_ZBUFFER),
  259.     DDCAPDEF( "OWNDC",                ddsCaps.dwCaps, DDSCAPS_OWNDC),
  260.     DDCAPDEF( "LIVEVIDEO",            ddsCaps.dwCaps, DDSCAPS_LIVEVIDEO),
  261.     DDCAPDEF( "HWCODEC",              ddsCaps.dwCaps, DDSCAPS_HWCODEC),
  262.     DDCAPDEF( "MODEX",                ddsCaps.dwCaps, DDSCAPS_MODEX),
  263.     { "", 0, 0}
  264. };
  265.  
  266. /****************************************************************************
  267.  ***************************************************************************/
  268. CAPDEF SVisionCapsDefs[] =
  269. {
  270.     DDCAPDEF( "ENIGMA",  dwSVCaps, DDSVCAPS_ENIGMA),
  271.     DDCAPDEF( "FLICKER", dwSVCaps, DDSVCAPS_FLICKER),
  272.     DDCAPDEF( "REDBLUE", dwSVCaps, DDSVCAPS_REDBLUE),
  273.     DDCAPDEF( "SPLIT",   dwSVCaps, DDSVCAPS_SPLIT),
  274.     { "", 0, 0}
  275. };
  276.  
  277. /****************************************************************************
  278.  ***************************************************************************/
  279. CAPDEF ROPCapsDefs[] =
  280. {
  281.     ROPDEF("SRCCOPY",    SRCCOPY),
  282.     ROPDEF("SRCPAINT",   SRCPAINT),
  283.     ROPDEF("SRCAND",     SRCAND),
  284.     ROPDEF("SRCINVERT",  SRCINVERT),
  285.     ROPDEF("SRCERASE",   SRCERASE),
  286.     ROPDEF("NOTSRCCOPY", NOTSRCCOPY),
  287.     ROPDEF("NOTSRCERASE",NOTSRCERASE),
  288.     ROPDEF("MERGECOPY",  MERGECOPY),
  289.     ROPDEF("MERGEPAINT", MERGEPAINT),
  290.     ROPDEF("PATCOPY",    PATCOPY),
  291.     ROPDEF("PATPAINT",   PATPAINT),
  292.     ROPDEF("PATINVERT",  PATINVERT),
  293.     ROPDEF("DSTINVERT",  DSTINVERT),
  294.     ROPDEF("BLACKNESS",  BLACKNESS),
  295.     ROPDEF("WHITENESS",  WHITENESS),
  296.     {"", 0, 0}
  297. };
  298.  
  299. /****************************************************************************
  300.  ***************************************************************************/
  301. CAPDEFS DDCapDefs[] =
  302. {
  303.     {"",                    DDAddCaps,          (LPARAM)OtherInfoDefs},
  304.     {"General",             DDAddCaps,          (LPARAM)OtherInfoDefs},
  305.     {"General Caps",        DDAddCaps,          (LPARAM)CapsDefs},
  306.     {"Color Key Caps",      DDAddCaps,          (LPARAM)CKeyCapsDefs},
  307.     {"FX Caps",             DDAddCaps,          (LPARAM)FXCapsDefs},
  308.     {"Palette Caps",        DDAddCaps,          (LPARAM)PalCapsDefs},
  309.     {"Surface Caps",        DDAddCaps,          (LPARAM)SurfCapsDefs},
  310.     {"Stereo Vision Caps",  DDAddCaps,          (LPARAM)SVisionCapsDefs},
  311.     {"ROPS",                DDAddCaps,          (LPARAM)ROPCapsDefs},
  312.     {"Video Modes",         DDAddVideoModes,    (LPARAM)0},
  313.     {"FourCCFormat",        DDFourCCFormat,      (LPARAM)0},
  314.     { NULL, 0, 0}
  315. };
  316.  
  317. /****************************************************************************
  318.  ***************************************************************************/
  319. CAPDEF ValidFlags[] =
  320. {
  321.     D3CAPDEF("COLORMODEL",            dwFlags, D3DDD_COLORMODEL),           
  322.     D3CAPDEF("DEVCAPS",               dwFlags, D3DDD_DEVCAPS),              
  323.     D3CAPDEF("TRANSFORMCAPS",         dwFlags, D3DDD_TRANSFORMCAPS),        
  324.     D3CAPDEF("LIGHTINGCAPS",          dwFlags, D3DDD_LIGHTINGCAPS),         
  325.     D3CAPDEF("BCLIPPING",             dwFlags, D3DDD_BCLIPPING),            
  326.     D3CAPDEF("LINECAPS",              dwFlags, D3DDD_LINECAPS),             
  327.     D3CAPDEF("TRICAPS",               dwFlags, D3DDD_TRICAPS),              
  328.     D3CAPDEF("DEVICERENDERBITDEPTH",  dwFlags, D3DDD_DEVICERENDERBITDEPTH), 
  329.     D3CAPDEF("DEVICEZBUFFERBITDEPTH", dwFlags, D3DDD_DEVICEZBUFFERBITDEPTH),
  330.     D3CAPDEF("MAXBUFFERSIZE",         dwFlags, D3DDD_MAXBUFFERSIZE),        
  331.     D3CAPDEF("MAXVERTEXCOUNT",        dwFlags, D3DDD_MAXVERTEXCOUNT),       
  332.     {"",0,0}
  333. };
  334.  
  335. /****************************************************************************
  336.  ***************************************************************************/
  337. CAPDEF ColorModel[] =
  338. {
  339.     D3CAPDEF("D3DCOLOR_MONO",            dcmColorModel, D3DCOLOR_MONO),           
  340.     D3CAPDEF("D3DCOLOR_RGB",               dcmColorModel, D3DCOLOR_RGB),              
  341.     {"",0,0}
  342.  };
  343.  
  344. /****************************************************************************
  345.  ***************************************************************************/
  346. CAPDEF DevCaps[] =
  347. {
  348.     D3CAPDEF("SORTINCREASINGZ",     dwDevCaps, D3DDEVCAPS_SORTINCREASINGZ),     
  349.     D3CAPDEF("SORTDECREASINGZ",     dwDevCaps, D3DDEVCAPS_SORTDECREASINGZ),     
  350.     D3CAPDEF("SORTEXACT",           dwDevCaps, D3DDEVCAPS_SORTEXACT),           
  351.     D3CAPDEF("EXECUTESYSTEMMEMORY", dwDevCaps, D3DDEVCAPS_EXECUTESYSTEMMEMORY), 
  352.     D3CAPDEF("EXECUTEVIDEOMEMORY",  dwDevCaps, D3DDEVCAPS_EXECUTEVIDEOMEMORY),  
  353.     D3CAPDEF("TLVERTEXSYSTEMEMORY", dwDevCaps, D3DDEVCAPS_TLVERTEXSYSTEMMEMORY),
  354.     D3CAPDEF("TLVERTEXVIDEOMEMORY", dwDevCaps, D3DDEVCAPS_TLVERTEXVIDEOMEMORY), 
  355.     D3CAPDEF("TEXTURESYSTEMMEMORY", dwDevCaps, D3DDEVCAPS_TEXTURESYSTEMMEMORY), 
  356.     D3CAPDEF("TEXTUREVIDEOMEMORY",  dwDevCaps, D3DDEVCAPS_TEXTUREVIDEOMEMORY),  
  357.     {"",0,0}
  358. };
  359.  
  360. /****************************************************************************
  361.  ***************************************************************************/
  362. CAPDEF TransformCaps[] =
  363. {
  364.     D3CAPDEF("CLIP",  dtcTransformCaps.dwCaps, D3DTRANSFORMCAPS_CLIP),  
  365.     {"",0,0}
  366. };
  367.  
  368. /****************************************************************************
  369.  ***************************************************************************/
  370. CAPDEF LightingCaps[] =
  371. {
  372.     D3CAPDEF("D3DLIGHTINGMODEL_RGB",       dlcLightingCaps.dwLightingModel, D3DLIGHTINGMODEL_RGB),      
  373.     D3CAPDEF("D3DLIGHTINGMODEL_MONO",      dlcLightingCaps.dwLightingModel, D3DLIGHTINGMODEL_MONO),     
  374.  
  375.     D3CAPDEF("D3DLIGHTCAPS_POINT",         dlcLightingCaps.dwCaps,          D3DLIGHTCAPS_POINT),        
  376.     D3CAPDEF("D3DLIGHTCAPS_SPOT",          dlcLightingCaps.dwCaps,          D3DLIGHTCAPS_SPOT),         
  377.     D3CAPDEF("D3DLIGHTCAPS_DIRECTIONAL",   dlcLightingCaps.dwCaps,          D3DLIGHTCAPS_DIRECTIONAL),  
  378.     D3CAPDEF("D3DLIGHTCAPS_PARALLELPOINT", dlcLightingCaps.dwCaps,          D3DLIGHTCAPS_PARALLELPOINT),
  379.     D3CAPDEF("D3DLIGHTCAPS_GLSPOT",        dlcLightingCaps.dwCaps,          D3DLIGHTCAPS_GLSPOT),       
  380.     D3VALDEF("dwNumLights",                dlcLightingCaps.dwNumLights),   
  381.     {"",0,0}
  382. };
  383.  
  384. /****************************************************************************
  385.  ***************************************************************************/
  386. CAPDEF BClipping[] =
  387. {
  388.     D3CAPDEF("bClipping", bClipping, TRUE),
  389.     {"",0,0}
  390. };
  391.  
  392. /****************************************************************************
  393.  ***************************************************************************/
  394. CAPDEF LineCaps[] =
  395. {
  396.     D3CAPDEF("D3DPMISCCAPS_MASKPLANES",            dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_MASKPLANES),         
  397.     D3CAPDEF("D3DPMISCCAPS_MASKZ",                 dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_MASKZ),              
  398.     D3CAPDEF("D3DPMISCCAPS_LINEPATTERNREP",        dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_LINEPATTERNREP),     
  399.     D3CAPDEF("D3DPMISCCAPS_CONFORMANT",            dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_CONFORMANT),         
  400.     D3CAPDEF("D3DPMISCCAPS_CULLNONE",              dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_CULLNONE),           
  401.     D3CAPDEF("D3DPMISCCAPS_CULLCW",                dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_CULLCW),             
  402.     D3CAPDEF("D3DPMISCCAPS_CULLCCW",               dpcLineCaps.dwMiscCaps,           D3DPMISCCAPS_CULLCCW),            
  403.     
  404.     D3CAPDEF("D3DPRASTERCAPS_DITHER",              dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_DITHER),           
  405.     D3CAPDEF("D3DPRASTERCAPS_ROP2",                dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_ROP2),             
  406.     D3CAPDEF("D3DPRASTERCAPS_XOR",                 dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_XOR),              
  407.     D3CAPDEF("D3DPRASTERCAPS_PAT",                 dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_PAT),              
  408.     D3CAPDEF("D3DPRASTERCAPS_ZTEST",               dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_ZTEST),            
  409.     D3CAPDEF("D3DPRASTERCAPS_SUBPIXEL",            dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_SUBPIXEL),         
  410.     D3CAPDEF("D3DPRASTERCAPS_SUBPIXELX",           dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_SUBPIXELX),        
  411.     D3CAPDEF("D3DPRASTERCAPS_FOGVERTEX",           dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_FOGVERTEX),        
  412.     D3CAPDEF("D3DPRASTERCAPS_FOGTABLE",            dpcLineCaps.dwRasterCaps,         D3DPRASTERCAPS_FOGTABLE),         
  413.     
  414.     D3CAPDEF("D3DPCMPCAPS_NEVER",                  dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_NEVER                 ),
  415.     D3CAPDEF("D3DPCMPCAPS_LESS",                   dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_LESS                  ),
  416.     D3CAPDEF("D3DPCMPCAPS_EQUAL",                  dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_EQUAL                 ),
  417.     D3CAPDEF("D3DPCMPCAPS_LESSEQUAL",              dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_LESSEQUAL             ),
  418.     D3CAPDEF("D3DPCMPCAPS_GREATER",                dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_GREATER               ),
  419.     D3CAPDEF("D3DPCMPCAPS_NOTEQUAL",               dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_NOTEQUAL              ),
  420.     D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL",           dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_GREATEREQUAL          ),
  421.     D3CAPDEF("D3DPCMPCAPS_ALWAYS",                 dpcLineCaps.dwZCmpCaps,           D3DPCMPCAPS_ALWAYS                ),
  422.     
  423.     D3CAPDEF("D3DPBLENDCAPS_ZERO",                 dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_ZERO                ),
  424.     D3CAPDEF("D3DPBLENDCAPS_ONE",                  dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_ONE                 ),
  425.     D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR",             dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_SRCCOLOR            ),
  426.     D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR",          dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVSRCCOLOR         ),
  427.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHA",             dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_SRCALPHA            ),
  428.     D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA",          dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVSRCALPHA         ),
  429.     D3CAPDEF("D3DPBLENDCAPS_DESTALPHA",            dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_DESTALPHA           ),
  430.     D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA",         dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVDESTALPHA        ),
  431.     D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR",            dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_DESTCOLOR           ),
  432.     D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR",         dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVDESTCOLOR        ),
  433.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT",          dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_SRCALPHASAT         ),
  434.     D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA",         dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_BOTHSRCALPHA        ),
  435.     D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA",      dpcLineCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_BOTHINVSRCALPHA     ),
  436.  
  437.     D3CAPDEF("D3DPBLENDCAPS_ZERO",                 dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_ZERO                ),
  438.     D3CAPDEF("D3DPBLENDCAPS_ONE",                  dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_ONE                 ),
  439.     D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR",             dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_SRCCOLOR            ),
  440.     D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR",          dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVSRCCOLOR         ),
  441.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHA",             dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_SRCALPHA            ),
  442.     D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA",          dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVSRCALPHA         ),
  443.     D3CAPDEF("D3DPBLENDCAPS_DESTALPHA",            dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_DESTALPHA           ),
  444.     D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA",         dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVDESTALPHA        ),
  445.     D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR",            dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_DESTCOLOR           ),
  446.     D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR",         dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVDESTCOLOR        ),
  447.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT",          dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_SRCALPHASAT         ),
  448.     D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA",         dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_BOTHSRCALPHA        ),
  449.     D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA",      dpcLineCaps.dwDestBlendCaps,      D3DPBLENDCAPS_BOTHINVSRCALPHA     ),
  450.     
  451.     D3CAPDEF("D3DPCMPCAPS_NEVER",                  dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_NEVER                 ),
  452.     D3CAPDEF("D3DPCMPCAPS_LESS",                   dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_LESS                  ),
  453.     D3CAPDEF("D3DPCMPCAPS_EQUAL",                  dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_EQUAL                 ),
  454.     D3CAPDEF("D3DPCMPCAPS_LESSEQUAL",              dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_LESSEQUAL             ),
  455.     D3CAPDEF("D3DPCMPCAPS_GREATER",                dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_GREATER               ),
  456.     D3CAPDEF("D3DPCMPCAPS_NOTEQUAL",               dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_NOTEQUAL              ),
  457.     D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL",           dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_GREATEREQUAL          ),
  458.     D3CAPDEF("D3DPCMPCAPS_ALWAYS",                 dpcLineCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_ALWAYS                ),
  459.     
  460.     D3CAPDEF("D3DPSHADECAPS_COLORFLATMONO",        dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_COLORFLATMONO       ),
  461.     D3CAPDEF("D3DPSHADECAPS_COLORFLATRGB",         dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_COLORFLATRGB        ),
  462.     D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDMONO",     dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_COLORGOURAUDMONO    ),
  463.     D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDRGB",      dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_COLORGOURAUDRGB     ),
  464.     D3CAPDEF("D3DPSHADECAPS_COLORPHONGMONO",       dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_COLORPHONGMONO      ),
  465.     D3CAPDEF("D3DPSHADECAPS_COLORPHONGRGB",        dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_COLORPHONGRGB       ),
  466.     
  467.     D3CAPDEF("D3DPSHADECAPS_SPECULARFLATMONO",     dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARFLATMONO    ),
  468.     D3CAPDEF("D3DPSHADECAPS_SPECULARFLATRGB",      dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARFLATRGB     ),
  469.     D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDMONO",  dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARGOURAUDMONO ),
  470.     D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDRGB",   dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARGOURAUDRGB  ),
  471.     D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGMONO",    dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARPHONGMONO   ),
  472.     D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGRGB",     dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARPHONGRGB    ),
  473.     
  474.     D3CAPDEF("D3DPSHADECAPS_ALPHAFLATBLEND",       dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAFLATBLEND      ),
  475.     D3CAPDEF("D3DPSHADECAPS_ALPHAFLATSTIPPLED",    dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAFLATSTIPPLED   ),
  476.     D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDBLEND",    dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAGOURAUDBLEND   ),
  477.     D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED", dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED),
  478.     D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGBLEND",      dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAPHONGBLEND     ),
  479.     D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGSTIPPLED",   dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAPHONGSTIPPLED  ),
  480.     
  481.     D3CAPDEF("D3DPSHADECAPS_FOGFLAT",              dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_FOGFLAT             ),
  482.     D3CAPDEF("D3DPSHADECAPS_FOGGOURAUD",           dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_FOGGOURAUD          ),
  483.     D3CAPDEF("D3DPSHADECAPS_FOGPHONG",             dpcLineCaps.dwShadeCaps,          D3DPSHADECAPS_FOGPHONG            ),
  484.     
  485.     D3CAPDEF("D3DPTEXTURECAPS_PERSPECTIVE",        dpcLineCaps.dwTextureCaps,        D3DPTEXTURECAPS_PERSPECTIVE       ),
  486.     D3CAPDEF("D3DPTEXTURECAPS_POW2",               dpcLineCaps.dwTextureCaps,        D3DPTEXTURECAPS_POW2              ),
  487.     D3CAPDEF("D3DPTEXTURECAPS_ALPHA",              dpcLineCaps.dwTextureCaps,        D3DPTEXTURECAPS_ALPHA             ),
  488.     D3CAPDEF("D3DPTEXTURECAPS_TRANSPARENCY",       dpcLineCaps.dwTextureCaps,        D3DPTEXTURECAPS_TRANSPARENCY      ),
  489.     D3CAPDEF("D3DPTEXTURECAPS_BORDER",             dpcLineCaps.dwTextureCaps,        D3DPTEXTURECAPS_BORDER            ),
  490.     D3CAPDEF("D3DPTEXTURECAPS_SQUAREONLY",         dpcLineCaps.dwTextureCaps,        D3DPTEXTURECAPS_SQUAREONLY        ),
  491.     
  492.     
  493.     D3CAPDEF("D3DPTFILTERCAPS_NEAREST",            dpcLineCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_NEAREST           ),
  494.     D3CAPDEF("D3DPTFILTERCAPS_LINEAR",             dpcLineCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_LINEAR            ),
  495.     D3CAPDEF("D3DPTFILTERCAPS_MIPNEAREST",         dpcLineCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_MIPNEAREST        ),
  496.     D3CAPDEF("D3DPTFILTERCAPS_MIPLINEAR",          dpcLineCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_MIPLINEAR         ),
  497.     D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPNEAREST",   dpcLineCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_LINEARMIPNEAREST  ),
  498.     D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPLINEAR",    dpcLineCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_LINEARMIPLINEAR   ),
  499.     
  500.     
  501.     D3CAPDEF("D3DPTBLENDCAPS_DECAL",               dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_DECAL              ),
  502.     D3CAPDEF("D3DPTBLENDCAPS_MODULATE",            dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_MODULATE           ),
  503.     D3CAPDEF("D3DPTBLENDCAPS_DECALALPHA",          dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_DECALALPHA         ),
  504.     D3CAPDEF("D3DPTBLENDCAPS_MODULATEALPHA",       dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_MODULATEALPHA      ),
  505.     D3CAPDEF("D3DPTBLENDCAPS_DECALMASK",           dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_DECALMASK          ),
  506.     D3CAPDEF("D3DPTBLENDCAPS_MODULATEMASK",        dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_MODULATEMASK       ),
  507.     D3CAPDEF("D3DPTBLENDCAPS_COPY",                dpcLineCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_COPY               ),
  508.     
  509.     D3CAPDEF("D3DPTADDRESSCAPS_WRAP",              dpcLineCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_WRAP             ),
  510.     D3CAPDEF("D3DPTADDRESSCAPS_MIRROR",            dpcLineCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_MIRROR           ),
  511.     D3CAPDEF("D3DPTADDRESSCAPS_CLAMP",             dpcLineCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_CLAMP            ),
  512.     {"",0,0}
  513. };
  514.  
  515. /****************************************************************************
  516.  ***************************************************************************/
  517. CAPDEF TriCaps[] =
  518. {
  519.     D3CAPDEF("D3DPMISCCAPS_MASKPLANES",            dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_MASKPLANES),         
  520.     D3CAPDEF("D3DPMISCCAPS_MASKZ",                 dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_MASKZ),              
  521.     D3CAPDEF("D3DPMISCCAPS_LINEPATTERNREP",        dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_LINEPATTERNREP),     
  522.     D3CAPDEF("D3DPMISCCAPS_CONFORMANT",            dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_CONFORMANT),         
  523.     D3CAPDEF("D3DPMISCCAPS_CULLNONE",              dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_CULLNONE),           
  524.     D3CAPDEF("D3DPMISCCAPS_CULLCW",                dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_CULLCW),             
  525.     D3CAPDEF("D3DPMISCCAPS_CULLCCW",               dpcTriCaps.dwMiscCaps,           D3DPMISCCAPS_CULLCCW),            
  526.     
  527.     D3CAPDEF("D3DPRASTERCAPS_DITHER",              dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_DITHER),           
  528.     D3CAPDEF("D3DPRASTERCAPS_ROP2",                dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_ROP2),             
  529.     D3CAPDEF("D3DPRASTERCAPS_XOR",                 dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_XOR),              
  530.     D3CAPDEF("D3DPRASTERCAPS_PAT",                 dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_PAT),              
  531.     D3CAPDEF("D3DPRASTERCAPS_ZTEST",               dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_ZTEST),            
  532.     D3CAPDEF("D3DPRASTERCAPS_SUBPIXEL",            dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_SUBPIXEL),         
  533.     D3CAPDEF("D3DPRASTERCAPS_SUBPIXELX",           dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_SUBPIXELX),        
  534.     D3CAPDEF("D3DPRASTERCAPS_FOGVERTEX",           dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_FOGVERTEX),        
  535.     D3CAPDEF("D3DPRASTERCAPS_FOGTABLE",            dpcTriCaps.dwRasterCaps,         D3DPRASTERCAPS_FOGTABLE),         
  536.     
  537.     D3CAPDEF("D3DPCMPCAPS_NEVER",                  dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_NEVER                 ),
  538.     D3CAPDEF("D3DPCMPCAPS_LESS",                   dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_LESS                  ),
  539.     D3CAPDEF("D3DPCMPCAPS_EQUAL",                  dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_EQUAL                 ),
  540.     D3CAPDEF("D3DPCMPCAPS_LESSEQUAL",              dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_LESSEQUAL             ),
  541.     D3CAPDEF("D3DPCMPCAPS_GREATER",                dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_GREATER               ),
  542.     D3CAPDEF("D3DPCMPCAPS_NOTEQUAL",               dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_NOTEQUAL              ),
  543.     D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL",           dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_GREATEREQUAL          ),
  544.     D3CAPDEF("D3DPCMPCAPS_ALWAYS",                 dpcTriCaps.dwZCmpCaps,           D3DPCMPCAPS_ALWAYS                ),
  545.     
  546.     D3CAPDEF("D3DPBLENDCAPS_ZERO",                 dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_ZERO                ),
  547.     D3CAPDEF("D3DPBLENDCAPS_ONE",                  dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_ONE                 ),
  548.     D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR",             dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_SRCCOLOR            ),
  549.     D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR",          dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVSRCCOLOR         ),
  550.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHA",             dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_SRCALPHA            ),
  551.     D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA",          dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVSRCALPHA         ),
  552.     D3CAPDEF("D3DPBLENDCAPS_DESTALPHA",            dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_DESTALPHA           ),
  553.     D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA",         dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVDESTALPHA        ),
  554.     D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR",            dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_DESTCOLOR           ),
  555.     D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR",         dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_INVDESTCOLOR        ),
  556.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT",          dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_SRCALPHASAT         ),
  557.     D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA",         dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_BOTHSRCALPHA        ),
  558.     D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA",      dpcTriCaps.dwSrcBlendCaps,       D3DPBLENDCAPS_BOTHINVSRCALPHA     ),
  559.     
  560.     D3CAPDEF("D3DPBLENDCAPS_ZERO",                 dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_ZERO                ),
  561.     D3CAPDEF("D3DPBLENDCAPS_ONE",                  dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_ONE                 ),
  562.     D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR",             dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_SRCCOLOR            ),
  563.     D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR",          dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVSRCCOLOR         ),
  564.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHA",             dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_SRCALPHA            ),
  565.     D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA",          dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVSRCALPHA         ),
  566.     D3CAPDEF("D3DPBLENDCAPS_DESTALPHA",            dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_DESTALPHA           ),
  567.     D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA",         dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVDESTALPHA        ),
  568.     D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR",            dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_DESTCOLOR           ),
  569.     D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR",         dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_INVDESTCOLOR        ),
  570.     D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT",          dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_SRCALPHASAT         ),
  571.     D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA",         dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_BOTHSRCALPHA        ),
  572.     D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA",      dpcTriCaps.dwDestBlendCaps,      D3DPBLENDCAPS_BOTHINVSRCALPHA     ),
  573.     
  574.     D3CAPDEF("D3DPCMPCAPS_NEVER",                  dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_NEVER                 ),
  575.     D3CAPDEF("D3DPCMPCAPS_LESS",                   dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_LESS                  ),
  576.     D3CAPDEF("D3DPCMPCAPS_EQUAL",                  dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_EQUAL                 ),
  577.     D3CAPDEF("D3DPCMPCAPS_LESSEQUAL",              dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_LESSEQUAL             ),
  578.     D3CAPDEF("D3DPCMPCAPS_GREATER",                dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_GREATER               ),
  579.     D3CAPDEF("D3DPCMPCAPS_NOTEQUAL",               dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_NOTEQUAL              ),
  580.     D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL",           dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_GREATEREQUAL          ),
  581.     D3CAPDEF("D3DPCMPCAPS_ALWAYS",                 dpcTriCaps.dwAlphaCmpCaps,       D3DPCMPCAPS_ALWAYS                ),
  582.     
  583.     D3CAPDEF("D3DPSHADECAPS_COLORFLATMONO",        dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_COLORFLATMONO       ),
  584.     D3CAPDEF("D3DPSHADECAPS_COLORFLATRGB",         dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_COLORFLATRGB        ),
  585.     D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDMONO",     dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_COLORGOURAUDMONO    ),
  586.     D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDRGB",      dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_COLORGOURAUDRGB     ),
  587.     D3CAPDEF("D3DPSHADECAPS_COLORPHONGMONO",       dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_COLORPHONGMONO      ),
  588.     D3CAPDEF("D3DPSHADECAPS_COLORPHONGRGB",        dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_COLORPHONGRGB       ),
  589.     
  590.     D3CAPDEF("D3DPSHADECAPS_SPECULARFLATMONO",     dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARFLATMONO    ),
  591.     D3CAPDEF("D3DPSHADECAPS_SPECULARFLATRGB",      dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARFLATRGB     ),
  592.     D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDMONO",  dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARGOURAUDMONO ),
  593.     D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDRGB",   dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARGOURAUDRGB  ),
  594.     D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGMONO",    dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARPHONGMONO   ),
  595.     D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGRGB",     dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_SPECULARPHONGRGB    ),
  596.     
  597.     D3CAPDEF("D3DPSHADECAPS_ALPHAFLATBLEND",       dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAFLATBLEND      ),
  598.     D3CAPDEF("D3DPSHADECAPS_ALPHAFLATSTIPPLED",    dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAFLATSTIPPLED   ),
  599.     D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDBLEND",    dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAGOURAUDBLEND   ),
  600.     D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED", dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED),
  601.     D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGBLEND",      dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAPHONGBLEND     ),
  602.     D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGSTIPPLED",   dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_ALPHAPHONGSTIPPLED  ),
  603.     
  604.     D3CAPDEF("D3DPSHADECAPS_FOGFLAT",              dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_FOGFLAT             ),
  605.     D3CAPDEF("D3DPSHADECAPS_FOGGOURAUD",           dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_FOGGOURAUD          ),
  606.     D3CAPDEF("D3DPSHADECAPS_FOGPHONG",             dpcTriCaps.dwShadeCaps,          D3DPSHADECAPS_FOGPHONG            ),
  607.     
  608.     D3CAPDEF("D3DPTEXTURECAPS_PERSPECTIVE",        dpcTriCaps.dwTextureCaps,        D3DPTEXTURECAPS_PERSPECTIVE       ),
  609.     D3CAPDEF("D3DPTEXTURECAPS_POW2",               dpcTriCaps.dwTextureCaps,        D3DPTEXTURECAPS_POW2              ),
  610.     D3CAPDEF("D3DPTEXTURECAPS_ALPHA",              dpcTriCaps.dwTextureCaps,        D3DPTEXTURECAPS_ALPHA             ),
  611.     D3CAPDEF("D3DPTEXTURECAPS_TRANSPARENCY",       dpcTriCaps.dwTextureCaps,        D3DPTEXTURECAPS_TRANSPARENCY      ),
  612.     D3CAPDEF("D3DPTEXTURECAPS_BORDER",             dpcTriCaps.dwTextureCaps,        D3DPTEXTURECAPS_BORDER            ),
  613.     D3CAPDEF("D3DPTEXTURECAPS_SQUAREONLY",         dpcTriCaps.dwTextureCaps,        D3DPTEXTURECAPS_SQUAREONLY        ),
  614.     
  615.     
  616.     D3CAPDEF("D3DPTFILTERCAPS_NEAREST",            dpcTriCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_NEAREST           ),
  617.     D3CAPDEF("D3DPTFILTERCAPS_LINEAR",             dpcTriCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_LINEAR            ),
  618.     D3CAPDEF("D3DPTFILTERCAPS_MIPNEAREST",         dpcTriCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_MIPNEAREST        ),
  619.     D3CAPDEF("D3DPTFILTERCAPS_MIPLINEAR",          dpcTriCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_MIPLINEAR         ),
  620.     D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPNEAREST",   dpcTriCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_LINEARMIPNEAREST  ),
  621.     D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPLINEAR",    dpcTriCaps.dwTextureFilterCaps,  D3DPTFILTERCAPS_LINEARMIPLINEAR   ),
  622.     
  623.     
  624.     D3CAPDEF("D3DPTBLENDCAPS_DECAL",               dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_DECAL              ),
  625.     D3CAPDEF("D3DPTBLENDCAPS_MODULATE",            dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_MODULATE           ),
  626.     D3CAPDEF("D3DPTBLENDCAPS_DECALALPHA",          dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_DECALALPHA         ),
  627.     D3CAPDEF("D3DPTBLENDCAPS_MODULATEALPHA",       dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_MODULATEALPHA      ),
  628.     D3CAPDEF("D3DPTBLENDCAPS_DECALMASK",           dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_DECALMASK          ),
  629.     D3CAPDEF("D3DPTBLENDCAPS_MODULATEMASK",        dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_MODULATEMASK       ),
  630.     D3CAPDEF("D3DPTBLENDCAPS_COPY",                dpcTriCaps.dwTextureBlendCaps,   D3DPTBLENDCAPS_COPY               ),
  631.     
  632.     D3CAPDEF("D3DPTADDRESSCAPS_WRAP",              dpcTriCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_WRAP             ),
  633.     D3CAPDEF("D3DPTADDRESSCAPS_MIRROR",            dpcTriCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_MIRROR           ),
  634.     D3CAPDEF("D3DPTADDRESSCAPS_CLAMP",             dpcTriCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_CLAMP            ),
  635.     {"",0,0}
  636. };
  637.  
  638. /****************************************************************************
  639.  ***************************************************************************/
  640. CAPDEF D3dMisc[] =
  641. {
  642.     D3VALDEF("MaxBufferSize",         dwMaxBufferSize),        
  643.     D3VALDEF("MaxVertexCount",        dwMaxVertexCount),       
  644.     D3VALDEF("DeviceRenderBitDepth",  dwDeviceRenderBitDepth), 
  645.     D3VALDEF("DeviceZBufferBitDepth", dwDeviceZBufferBitDepth),
  646.     {"",0,0}
  647. };
  648.  
  649. /****************************************************************************
  650.  ***************************************************************************/
  651. CAPDEFS D3CapDefs[] =
  652. {
  653.     {"",              D3AddCaps, (LPARAM)ValidFlags},  
  654.     {"ColorModel",    D3AddCaps, (LPARAM)ColorModel},
  655.     {"DevCaps",       D3AddCaps, (LPARAM)DevCaps},
  656.     {"TransformCaps", D3AddCaps, (LPARAM)TransformCaps},
  657.     {"LightingCaps",  D3AddCaps, (LPARAM)LightingCaps},
  658.     {"BClipping",     D3AddCaps, (LPARAM)BClipping},
  659.     {"LineCaps",      D3AddCaps, (LPARAM)LineCaps},
  660.     {"TriCaps",       D3AddCaps, (LPARAM)TriCaps},
  661.     {"Misc",          D3AddCaps, (LPARAM)D3dMisc},      
  662.     {NULL, 0, 0}
  663. };
  664.  
  665. /****************************************************************************
  666.  ***************************************************************************/
  667. CAPDEF DSInfo[] =
  668. {
  669.     DSVALDEF("MinSecondarySampleRate",          dwMinSecondarySampleRate),
  670.     DSVALDEF("MaxSecondarySampleRate",          dwMaxSecondarySampleRate),
  671.     DSVALDEF("PrimaryBuffers",                  dwPrimaryBuffers),
  672.     DSVALDEF("MaxHwMixingAllBuffers",           dwMaxHwMixingAllBuffers),
  673.     DSVALDEF("MaxHwMixingStaticBuffers",        dwMaxHwMixingStaticBuffers),
  674.     DSVALDEF("MaxHwMixingStreamingBuffers",     dwMaxHwMixingStreamingBuffers),
  675.     DSVALDEF("FreeHwMixingAllBuffers",          dwFreeHwMixingAllBuffers),
  676.     DSVALDEF("FreeHwMixingStaticBuffers",       dwFreeHwMixingStaticBuffers),
  677.     DSVALDEF("FreeHwMixingStreamingBuffers",    dwFreeHwMixingStreamingBuffers),
  678.     DSVALDEF("MaxHw3DAllBuffers",               dwMaxHw3DAllBuffers),
  679.     DSVALDEF("MaxHw3DStaticBuffers",            dwMaxHw3DStaticBuffers),
  680.     DSVALDEF("MaxHw3DStreamingBuffers",         dwMaxHw3DStreamingBuffers),
  681.     DSVALDEF("FreeHw3DAllBuffers",              dwFreeHw3DAllBuffers),
  682.     DSVALDEF("FreeHw3DStaticBuffers",           dwFreeHw3DStaticBuffers),
  683.     DSVALDEF("FreeHw3DStreamingBuffers",        dwFreeHw3DStreamingBuffers),
  684.     DSVALDEF("TotalHwMemBytes",                 dwTotalHwMemBytes),
  685.     DSVALDEF("FreeHwMemBytes",                  dwFreeHwMemBytes),
  686.     DSVALDEF("MaxContigFreeHwMemBytes",         dwMaxContigFreeHwMemBytes),
  687.     DSVALDEF("UnlockTransferRateHwBuffers",     dwUnlockTransferRateHwBuffers),
  688.     DSVALDEF("PlayCpuOverheadSwBuffers",        dwPlayCpuOverheadSwBuffers),
  689.     {"", 0, 0}
  690. };
  691.  
  692. /****************************************************************************
  693.  ***************************************************************************/
  694. CAPDEF DSGeneralCaps[] =
  695. {
  696.     DSCAPDEF("PRIMARYMONO",       dwFlags,    DSCAPS_PRIMARYMONO),
  697.     DSCAPDEF("PRIMARYSTEREO",     dwFlags,    DSCAPS_PRIMARYSTEREO),
  698.     DSCAPDEF("PRIMARY8BIT",       dwFlags,    DSCAPS_PRIMARY8BIT),
  699.     DSCAPDEF("PRIMARY16BIT",      dwFlags,    DSCAPS_PRIMARY16BIT),
  700.     DSCAPDEF("CONTINUOUSRATE",    dwFlags,    DSCAPS_CONTINUOUSRATE),
  701.     DSCAPDEF("EMULDRIVER",        dwFlags,    DSCAPS_EMULDRIVER),
  702.     DSCAPDEF("SECONDARYMONO",     dwFlags,    DSCAPS_SECONDARYMONO),
  703.     DSCAPDEF("SECONDARYSTEREO",   dwFlags,    DSCAPS_SECONDARYSTEREO),
  704.     DSCAPDEF("SECONDARY8BIT",     dwFlags,    DSCAPS_SECONDARY8BIT),
  705.     DSCAPDEF("SECONDARY16BIT",    dwFlags,    DSCAPS_SECONDARY16BIT),
  706.     {"", 0, 0}
  707. };
  708.  
  709. /****************************************************************************
  710.  ***************************************************************************/
  711. CAPDEFS DSCapDefs[] =
  712. {
  713.     {"",                    DSAddCaps,          (LPARAM)DSInfo},
  714.     {"General",             DSAddCaps,          (LPARAM)DSInfo},
  715.     {"General Caps",        DSAddCaps,          (LPARAM)DSGeneralCaps},
  716.     {NULL, 0, 0}
  717. };
  718.  
  719. /****************************************************************************
  720.  ***************************************************************************/
  721. CAPDEF DPInfo[] =
  722. {
  723.     DPVALDEF("MaxBufferSize", dwMaxBufferSize),
  724.     DPVALDEF("MaxQueueSize",  dwMaxQueueSize),
  725.     DPVALDEF("MaxPlayers",    dwMaxPlayers),
  726.     DPVALDEF("HundredBaud",   dwHundredBaud),
  727.     DPVALDEF("Latency",       dwLatency),
  728.     {"", 0, 0}
  729. };
  730.  
  731. /****************************************************************************
  732.  ***************************************************************************/
  733. CAPDEFS DPCapDefs[] =
  734. {
  735.     {"",                    DPAddCaps,          (LPARAM)DPInfo},
  736.     {"General",             DPAddCaps,          (LPARAM)DPInfo},
  737.     {"Sessions",            DPAddSessions,      (LPARAM)0},
  738.     {NULL, 0, 0}
  739. };
  740.  
  741. //================================================================
  742. //  WinMain - entry point
  743. //================================================================
  744. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  745. {
  746.     MSG msg;
  747.  
  748.     g_hInstance = hInstance; // Store instance handle in our global variable
  749.  
  750.     if (InitInstance(hInstance, lpCmdLine, nCmdShow, DXView_WIDTH, DXView_HEIGHT))
  751.     {
  752.         while(GetMessage(&msg, NULL, 0, 0))
  753.         {
  754.             TranslateMessage(&msg);
  755.             DispatchMessage(&msg);
  756.         }
  757.     }
  758.  
  759.     return(msg.wParam);
  760. }
  761.  
  762. //================================================================
  763. //  InitInstance - create main window
  764. //================================================================
  765. BOOL InitInstance(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow, int iWidth, int iHeight)
  766. {
  767.     WNDCLASS  wc;
  768.  
  769.     wc.style         = CS_HREDRAW | CS_VREDRAW; // Class style(s).
  770.     wc.lpfnWndProc   = (WNDPROC)WndProc;        // Window Procedure
  771.     wc.cbClsExtra    = 0;                       // No per-class extra data.
  772.     wc.cbWndExtra    = 0;                       // No per-window extra data.
  773.     wc.hInstance     = hInstance;               // Owner of this class
  774.     wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DIRECTX)); // Icon name from .RC
  775.     wc.hCursor       = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SPLIT));// Cursor
  776.     wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); // Default color
  777.     wc.lpszMenuName  = "Menu";                   // Menu name from .RC
  778.     wc.lpszClassName = g_szClassName;            // Name to register as
  779.  
  780.     if(!RegisterClass(&wc))
  781.     {
  782.         return FALSE;
  783.     }
  784.  
  785.     // Create a main window for this application instance.
  786.     g_hwndMain = CreateWindowEx(
  787.         0,
  788.         g_szClassName,   // See RegisterClass() call.
  789.         g_szTitle,       // Text for window title bar.
  790.         WS_OVERLAPPEDWINDOW,// Window style.
  791.         CW_USEDEFAULT, CW_USEDEFAULT, iWidth, iHeight, // Use default positioning
  792.         NULL,            // Overlapped windows have no parent.
  793.         NULL,            // Use the window class menu.
  794.         hInstance,       // This instance owns this window.
  795.         NULL);
  796.  
  797.     // If window could not be created, return "failure"
  798.     if (!g_hwndMain)
  799.     {
  800.         return(FALSE);
  801.     }
  802.  
  803.     // Make the window visible; update its client area; and return "success"
  804.     ShowWindow(g_hwndMain, nCmdShow); // Show the window
  805.  
  806.     return(TRUE);              // We succeeded...
  807. }
  808.  
  809. //================================================================
  810. //  WndProc - main window proc
  811. //================================================================
  812. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  813. {
  814.     switch(message)
  815.     {
  816.         case WM_CREATE:
  817.             return DXView_OnCreate(hwnd);
  818.  
  819.         case WM_SIZE:
  820.             DXView_OnSize(hwnd);
  821.             break;
  822.  
  823.         case WM_LBUTTONDOWN:
  824.             g_bSplitMove = TRUE;
  825.             SetCapture(hwnd);
  826.             break;
  827.  
  828.         case WM_LBUTTONUP:
  829.             g_bSplitMove = FALSE;
  830.             ReleaseCapture();
  831.             break;
  832.  
  833.         case WM_MOUSEMOVE:
  834.             if(g_bSplitMove)
  835.             {
  836.                 g_xPaneSplit = (LOWORD(lParam) - g_xHalfSplitWidth);
  837.                 DXView_OnSize(hwnd);
  838.             }
  839.             break;
  840.  
  841.         case WM_NOTIFY:
  842.             if (((NMHDR*)lParam)->hwndFrom == g_hwndTV)
  843.             {
  844.                 if (((NMHDR*)lParam)->code == TVN_SELCHANGED)
  845.                     DXView_OnTreeSelect(g_hwndTV, (NM_TREEVIEW*)lParam);
  846.             }
  847.  
  848.             if (((NMHDR*)lParam)->hwndFrom == g_hwndLV)
  849.             {
  850.                 if (((NMHDR*)lParam)->code == NM_RDBLCLK)
  851.                     DXView_OnListViewDblClick(g_hwndLV, (NM_LISTVIEW*)lParam);
  852.             }
  853.  
  854.             break;
  855.  
  856.         case WM_COMMAND:  // message: command from application menu
  857.             DXView_OnCommand(hwnd, wParam);
  858.             break;
  859.  
  860.         case WM_CLOSE:
  861.             DestroyWindow(hwnd);
  862.             return 0;
  863.  
  864.         case WM_DESTROY:  // message: window being destroyed
  865.             DXView_Cleanup();  // Free per item struct for all items
  866.             PostQuitMessage(0);
  867.             break;
  868.     }
  869.  
  870.     return(DefWindowProc(hwnd, message, wParam, lParam));
  871. }
  872.  
  873. //================================================================
  874. //================================================================
  875. BOOL DXView_OnCreate(HWND hwnd)
  876. {
  877.     HDC hDC;
  878.     int PixelsPerInch;
  879.     TEXTMETRIC tm;
  880.     static TCHAR szBuf[MAX_PATH];
  881.  
  882.     hDC = GetDC(hwnd);
  883.     PixelsPerInch = GetDeviceCaps(hDC, LOGPIXELSX);
  884.     g_hFont = GetStockObject(ANSI_FIXED_FONT);
  885.     SelectObject(hDC, g_hFont);
  886.     GetTextMetrics(hDC, &tm);
  887.     g_tmAveCharWidth = tm.tmAveCharWidth;
  888.     ReleaseDC(hwnd, hDC);
  889.  
  890.     // Initialize global data
  891.     g_dwViewState = IDM_VIEWAVAIL;
  892.     g_xPaneSplit = PixelsPerInch * 9 / 4;     //  2.25 inches
  893.     g_xHalfSplitWidth = GetSystemMetrics(SM_CXSIZEFRAME) / 2;
  894.  
  895.     // Make sure that the common control library read to rock
  896.     InitCommonControls();
  897.  
  898.     CheckMenuItem(GetMenu(hwnd), g_dwViewState, MF_BYCOMMAND | MF_CHECKED);
  899.  
  900.     // Create the list view window.
  901.     g_hwndLV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, "",
  902.         WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT,
  903.         0, 0, 0, 0, hwnd, (HMENU)IDC_LV, g_hInstance, NULL);
  904.  
  905.     // create the tree view window.
  906.     g_hwndTV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "",
  907.         WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES |
  908.         TVS_HASBUTTONS | TVS_LINESATROOT,
  909.         0, 0, 0, 0, hwnd, (HMENU)IDC_TV, g_hInstance, NULL);
  910.  
  911.     // create our image list.
  912.     DXView_InitImageList();
  913.  
  914.     // Initialize the tree view
  915.     DXView_FillTree(g_hwndTV);
  916.  
  917.     return(TRUE);
  918. }
  919.  
  920. //================================================================
  921. //================================================================
  922. IDirectDraw * DDCreate(GUID *pid)
  923. {
  924.     if (lpDD && pid == ddid)
  925.         return lpDD;
  926.  
  927.     if (lpDD)
  928.     {
  929.         IDirectDraw_Release(lpDD);
  930.         lpDD = NULL;
  931.     }
  932.  
  933.     // There is no need to create DirectDraw emulation-only just to get
  934.     // the HEL caps.  In fact, this will fail if there is another DirectDraw
  935.     // app running and using the hardware.
  936.     if( pid == (GUID *)DDCREATE_EMULATIONONLY )
  937.     {
  938.         pid = NULL;
  939.     }
  940.     if (DirectDrawCreate(pid, &lpDD, NULL) == DD_OK)
  941.     {
  942.         ddid = pid;
  943.         return lpDD;
  944.     }
  945.  
  946.     MessageBox(g_hwndMain, "DirectDrawCreate failed.", g_szAppName, MB_OK);
  947.     return NULL;
  948. }
  949.  
  950.  
  951. //================================================================
  952. //================================================================
  953. IDirectSound * DSCreate(GUID *pid)
  954. {
  955.     if (lpDS && pid == dsid)
  956.         return lpDS;
  957.  
  958.     if (lpDS)
  959.         IDirectSound_Release(lpDS);
  960.  
  961.     if (DirectSoundCreate(pid, &lpDS, NULL) == DD_OK)
  962.     {
  963.         dsid = pid;
  964.         return lpDS;
  965.     }
  966.  
  967.     MessageBox(g_hwndMain, "DirectSoundCreate failed.", g_szAppName, MB_OK);
  968.     return NULL;
  969. }
  970.  
  971. //================================================================
  972. //================================================================
  973. IDirectPlay * DPCreate(GUID *pid)
  974. {
  975.     if (lpDP && pid == dpid)
  976.         return lpDP;
  977.  
  978.     if (lpDP)
  979.         lpDP->lpVtbl->Release(lpDP);
  980.  
  981.     if (DirectPlayCreate(pid, &lpDP, NULL) == DD_OK)
  982.     {
  983.         dpid = pid;
  984.         return lpDP;
  985.     }
  986.  
  987.     MessageBox(g_hwndMain, "DirectPlayCreate failed.", g_szAppName, MB_OK);
  988.     return NULL;
  989. }
  990.  
  991. //================================================================
  992. //================================================================
  993. void AddCapsToTV(HTREEITEM hParent, CAPDEFS *pcds, LPARAM lParam1)
  994. {
  995.     HTREEITEM hTree;
  996.     BOOL f = TRUE;
  997.  
  998.     while (pcds->szName)
  999.     {
  1000.         hTree = TVAddNode(hParent, pcds->szName, f, IDI_CAPS,
  1001.             pcds->Callback, lParam1, pcds->lParam2);
  1002.  
  1003.         if (f)
  1004.         {
  1005.             hParent = hTree;
  1006.             f = FALSE;
  1007.         }
  1008.  
  1009.         pcds++;  // Get next Cap bit definition
  1010.     }
  1011. }
  1012.  
  1013. //================================================================
  1014. //================================================================
  1015. char c_szYes[] = "Yes";
  1016. char c_szNo[] = "No";
  1017. char c_szCurrentMode[] = "Current Mode";
  1018.  
  1019. //================================================================
  1020. //================================================================
  1021. void AddCapsToLV(CAPDEF *pcd, LPVOID pv)
  1022. {
  1023.     DWORD dwValue;
  1024.  
  1025.     LVAddColumn(g_hwndLV, 0, "Name", 24);
  1026.     LVAddColumn(g_hwndLV, 1, "Value", 10);
  1027.  
  1028.     while(pcd->szName && *pcd->szName)
  1029.     {
  1030.         dwValue = *(DWORD *)(((BYTE *)pv) + pcd->dwOffset);
  1031.  
  1032.         if (pcd->dwFlag)
  1033.         {
  1034.             if (pcd->dwFlag & dwValue)
  1035.             {
  1036.                 LVAddText(g_hwndLV, 0, pcd->szName);
  1037.                 LVAddText(g_hwndLV, 1, c_szYes);
  1038.             }
  1039.             else if (g_dwViewState == IDM_VIEWALL)
  1040.             {
  1041.                 LVAddText(g_hwndLV, 0, pcd->szName);
  1042.                 LVAddText(g_hwndLV, 1, c_szNo);
  1043.             }
  1044.         }
  1045.         else
  1046.         {
  1047.             LVAddText(g_hwndLV, 0, pcd->szName, "test");
  1048.             LVAddText(g_hwndLV, 1, "%d", dwValue);
  1049.         }
  1050.  
  1051.         pcd++;  // Get next Cap bit definition
  1052.     }
  1053. }
  1054.  
  1055. //================================================================
  1056. //================================================================
  1057. void DDAddCaps(LPARAM lParam1, LPARAM lParam2)
  1058. {
  1059.     // lParam1 is the GUID for the driver we should open
  1060.     // lParam2 is the CAPDEF table we should use
  1061.  
  1062.     if (DDCreate((GUID*)lParam1))
  1063.     {
  1064.         DDCAPS ddcaps;
  1065.  
  1066.         ddcaps.dwSize = sizeof(ddcaps);
  1067.  
  1068.         if (lParam1 == DDCREATE_EMULATIONONLY)
  1069.             IDirectDraw_GetCaps(lpDD, NULL, &ddcaps);
  1070.         else
  1071.             IDirectDraw_GetCaps(lpDD, &ddcaps, NULL);
  1072.  
  1073.         AddCapsToLV((CAPDEF *)lParam2, (LPVOID)&ddcaps);
  1074.     }
  1075. }
  1076.  
  1077. //================================================================
  1078. //================================================================
  1079. void DSAddCaps(LPARAM lParam1, LPARAM lParam2)
  1080. {
  1081.     // lParam1 is the GUID for the driver we should open
  1082.     // lParam2 is the CAPDEF table we should use
  1083.  
  1084.     if (DSCreate((GUID*)lParam1))
  1085.     {
  1086.         DSCAPS dscaps;
  1087.  
  1088.         dscaps.dwSize = sizeof(dscaps);
  1089.  
  1090.         IDirectSound_GetCaps(lpDS, &dscaps);
  1091.  
  1092.         AddCapsToLV((CAPDEF *)lParam2, (LPVOID)&dscaps);
  1093.     }
  1094. }
  1095.  
  1096. //================================================================
  1097. //================================================================
  1098. void DPAddCaps(LPARAM lParam1, LPARAM lParam2)
  1099. {
  1100.     // lParam1 is the GUID for the driver we should open
  1101.     // lParam2 is the CAPDEF table we should use
  1102.  
  1103.     if (DPCreate((GUID*)lParam1))
  1104.     {
  1105.         DPCAPS dpcaps;
  1106.  
  1107.         dpcaps.dwSize = sizeof(dpcaps);
  1108.         lpDP->lpVtbl->GetCaps(lpDP, &dpcaps);
  1109.  
  1110.         AddCapsToLV((CAPDEF *)lParam2, (LPVOID)&dpcaps);
  1111.     }
  1112. }
  1113.  
  1114. //================================================================
  1115. //================================================================
  1116. void D3AddCaps(LPARAM lParam1, LPARAM lParam2)
  1117. {
  1118.     // lParam1 is the CAP3DDEVICEDESC Struct
  1119.     // lParam2 is the CAPDEF table we should use
  1120.  
  1121.     // Unlike other AddCaps function this info has been prethought for us
  1122.     // so just print it out.
  1123.     AddCapsToLV((CAPDEF *)lParam2, (LPVOID)lParam1);
  1124. }
  1125.  
  1126. //================================================================
  1127. // EnumSessionsCallback
  1128. //================================================================
  1129. BOOL PASCAL EnumSessionsCallback
  1130. (
  1131. LPDPSESSIONDESC lpDesc,         // Pointer to Session Description Struct
  1132. LPVOID lpUser,                // User definable data passed in from EnumSessions() call.
  1133. LPDWORD lpdwTimeOut,          // Used to extend the timeout if hosts aren't responding quickly enough.
  1134. DWORD dwFlags                 // Flags (used to notify us when we've timed out).
  1135. )
  1136. {
  1137.     if (dwFlags & DPESC_TIMEDOUT)
  1138.     {
  1139.         // We could reset lpdwTimeOut and return true to continue waiting
  1140.         // NOTE: This does not tell DirectPlay to query again for hosts.
  1141.         //       This just gives potentially slow hosts more time to respond
  1142.         //       to our initial query.
  1143.         return FALSE;  // Stop waiting for hosts
  1144.     }
  1145.  
  1146.     // Add session information to table
  1147.     LVAddText(g_hwndLV, 0, lpDesc->szSessionName);
  1148.     LVAddText(g_hwndLV, 1, "%d", lpDesc->dwSession);
  1149.     LVAddText(g_hwndLV, 2, "%d", lpDesc->dwMaxPlayers);
  1150.     LVAddText(g_hwndLV, 3, "%d", lpDesc->dwCurrentPlayers);
  1151.  
  1152.     return TRUE;
  1153. }
  1154.  
  1155. //================================================================
  1156. //================================================================
  1157. void DPAddSessions(LPARAM lParam1, LPARAM lParam2)
  1158. {
  1159.     // lParam1 is the GUID for the driver we should open
  1160.     // lParam2 is the CAPDEF table we should use
  1161.  
  1162.     DPSESSIONDESC   dps;
  1163.     HCURSOR         hCur=NULL;
  1164.  
  1165.     dps.dwSize = sizeof(dps);
  1166.     memset(&dps.guidSession, 0, sizeof(dps.guidSession));
  1167.  
  1168.     hCur=SetCursor(LoadCursor(NULL, IDC_WAIT));
  1169.     if (DPCreate((GUID*)lParam1))
  1170.     {
  1171.         LVAddColumn(g_hwndLV, 0, "Name", 24);
  1172.         LVAddColumn(g_hwndLV, 1, "Session", 7);
  1173.         LVAddColumn(g_hwndLV, 2, "MaxPlayers", 11);
  1174.         LVAddColumn(g_hwndLV, 3, "CurrentPlayers", 14);
  1175.  
  1176.         lpDP->lpVtbl->EnumSessions(lpDP, &dps, 500, EnumSessionsCallback, NULL, DPENUMSESSIONS_ALL);
  1177.     }
  1178.     if (hCur)
  1179.         SetCursor(hCur);
  1180.  
  1181. }
  1182.  
  1183. //================================================================
  1184. //================================================================
  1185. void DDFourCCFormat(LPARAM lParam1, LPARAM lParam2)
  1186. {
  1187.     HRESULT ddrval;
  1188.     int iNumOfCodes,iCount;
  1189.     DWORD *FourCC;
  1190.     char szText[5]={0,0,0,0,0};
  1191.  
  1192.     if(lpDD != NULL)
  1193.     {
  1194.         ddrval = IDirectDraw_GetFourCCCodes(lpDD,&iNumOfCodes, NULL);
  1195.         LVAddColumn(g_hwndLV, 0, "Codes", 24);
  1196.         LVAddColumn(g_hwndLV, 1, "", 24);
  1197.         if( ddrval == DD_OK)
  1198.         {
  1199.             FourCC = GlobalAlloc(GPTR,(sizeof(DWORD)*iNumOfCodes));
  1200.             if(FourCC)
  1201.             {
  1202.                 ddrval = IDirectDraw_GetFourCCCodes(lpDD,&iNumOfCodes, FourCC);
  1203.                 // Assume all FourCC values are ascii strings
  1204.                 for(iCount = 0;iCount < iNumOfCodes; iCount++)
  1205.                 {
  1206.                     memcpy(szText,&FourCC[iCount],4);
  1207.                     LVAddText(g_hwndLV, 0, "%s", szText);
  1208.                 }
  1209.             }
  1210.         }
  1211.     }
  1212. }
  1213.  
  1214. //================================================================
  1215. //================================================================
  1216. typedef struct LLMode
  1217. {
  1218.     DWORD x,y,bpp;      
  1219.         BOOL IsModeX;
  1220.         struct LLMode *Next;
  1221. }LinkMode;      
  1222.  
  1223. static LinkMode *pModesHead = NULL; 
  1224.  
  1225. //================================================================
  1226. // EnumDisplayModesCallback1
  1227. //================================================================
  1228. HRESULT CALLBACK EnumDisplayModesCallback1(LPDDSURFACEDESC pddsd, LPVOID Context)
  1229. {
  1230.     static LinkMode *pModesTail = NULL; 
  1231.     LinkMode *tmp=NULL;
  1232.  
  1233.     tmp = GlobalAlloc(GPTR,sizeof(LinkMode));
  1234.     if(tmp != NULL)
  1235.     {
  1236.         tmp->x = pddsd->dwWidth;
  1237.         tmp->y = pddsd->dwHeight;
  1238.         tmp->bpp = pddsd->ddpfPixelFormat.dwRGBBitCount;
  1239.                 tmp->IsModeX = TRUE;
  1240.                 tmp->Next = NULL;
  1241.                 if(pModesHead == NULL)
  1242.                 {
  1243.                         pModesHead = tmp;
  1244.                         pModesTail = tmp;
  1245.                 }else
  1246.                 {
  1247.                         pModesTail->Next = tmp;
  1248.                         pModesTail = tmp;
  1249.                 }
  1250.     }//Hey if we out of memory silent failure
  1251.     return DDENUMRET_OK;
  1252.  
  1253. } /* EnumModesCallback */
  1254.  
  1255. //================================================================
  1256. // EnumDisplayModesCallback2
  1257. //================================================================
  1258. HRESULT CALLBACK EnumDisplayModesCallback2(LPDDSURFACEDESC pddsd, LPVOID Context)
  1259. {
  1260.     LinkMode *tmp= NULL;
  1261.  
  1262.     tmp = pModesHead;
  1263.     while(tmp != NULL) //cycle though all modes since unique modes don't always happen
  1264.     {
  1265.         if( tmp->x == pddsd->dwWidth &&
  1266.             tmp->y == pddsd->dwHeight &&
  1267.             tmp->bpp == pddsd->ddpfPixelFormat.dwRGBBitCount)
  1268.             {
  1269.                 tmp->IsModeX = FALSE;
  1270.         
  1271.             }
  1272.                 tmp = tmp->Next;
  1273.         }
  1274.     
  1275.     return DDENUMRET_OK;
  1276.  
  1277. } /* EnumModesCallback */
  1278.  
  1279. //================================================================
  1280. // EnumDisplayModesCallback2
  1281. //================================================================
  1282. void DisplayEnumModes()
  1283. {
  1284.     LinkMode *tmp= NULL;
  1285.  
  1286.     tmp = pModesHead;
  1287.     while(tmp != NULL) //cycle though all modes since unique modes don't always happen
  1288.     {
  1289.         if(tmp->IsModeX)
  1290.         {
  1291.             LVAddText(g_hwndLV, 0, "%dx%dx%d (ModeX)", tmp->x, tmp->y, tmp->bpp);
  1292.         }else
  1293.         {
  1294.             LVAddText(g_hwndLV, 0, "%dx%dx%d ", tmp->x, tmp->y, tmp->bpp);
  1295.         }
  1296.         tmp = tmp->Next;
  1297.     }
  1298. } /* EnumModesCallback */
  1299.  
  1300. //================================================================
  1301. // Should we hourglass the cursor? this takes a while
  1302. //================================================================
  1303. void DDAddVideoModes(LPARAM lParam1, LPARAM lParam2)
  1304. {
  1305.     DWORD mode;
  1306.     DDSURFACEDESC ddsd;
  1307.  
  1308.     LVAddColumn(g_hwndLV, 0, "Mode", 24);
  1309.     LVAddColumn(g_hwndLV, 1, "", 24);
  1310.  
  1311.     // lParam1 is the GUID for the driver we should open
  1312.     // lParam2 is not used
  1313.  
  1314.     if (DDCreate((GUID*)lParam1))
  1315.     {
  1316.         // Get the current mode mode for this driver
  1317.         ddsd.dwSize = sizeof(DDSURFACEDESC);
  1318.         IDirectDraw_GetDisplayMode(lpDD, &ddsd);
  1319.  
  1320.         mode = MAKEMODE(ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount);
  1321.  
  1322.         // Find all mode for this driver and add them to the listview
  1323.         //Erase previous list
  1324.         {
  1325.             LinkMode *tmp, *tmp1;       
  1326.  
  1327.             tmp = pModesHead;
  1328.             while(tmp != NULL)
  1329.             {
  1330.                 tmp1 = tmp;
  1331.                 tmp = tmp->Next;
  1332.                 GlobalFree(tmp1);  //Note We will exit with a list in place
  1333.             }
  1334.             pModesHead = NULL;
  1335.         }
  1336.         //Get Mode with ModeX
  1337.         IDirectDraw_SetCooperativeLevel(lpDD, g_hwndMain, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX | DDSCL_NOWINDOWCHANGES);
  1338.         IDirectDraw_EnumDisplayModes(lpDD, 0, NULL, (LPVOID)mode, EnumDisplayModesCallback1);
  1339.         //Get Modes with out ModeX
  1340.         IDirectDraw_SetCooperativeLevel(lpDD, g_hwndMain, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_NOWINDOWCHANGES);
  1341.         IDirectDraw_EnumDisplayModes(lpDD, 0, NULL, (LPVOID)mode, EnumDisplayModesCallback2);
  1342.         //Call Function to out stuff in listview
  1343.         DisplayEnumModes();
  1344.         IDirectDraw_SetCooperativeLevel(lpDD, g_hwndMain, DDSCL_NORMAL);
  1345.     }
  1346. }
  1347.  
  1348. //================================================================
  1349. //================================================================
  1350. void DXView_OnTreeSelect(HWND hwndTV, NM_TREEVIEW *ptv)
  1351. {
  1352.     NODEINFO *pni;
  1353.  
  1354.     SendMessage(g_hwndLV, WM_SETREDRAW, FALSE, 0);
  1355.     ListView_DeleteAllItems(g_hwndLV);
  1356.     LVAddColumn(g_hwndLV, 0, "", 0);
  1357.  
  1358.     if (ptv == NULL)
  1359.     {
  1360.         TV_ITEM tvi;
  1361.         // get lParam of current tree node
  1362.         tvi.hItem  = TreeView_GetSelection(g_hwndTV);
  1363.         tvi.mask   = TVIF_PARAM;
  1364.         tvi.lParam = 0;
  1365.         TreeView_GetItem(g_hwndTV, &tvi);
  1366.         pni = (NODEINFO*)tvi.lParam;
  1367.     }
  1368.     else
  1369.     {
  1370.         pni = (NODEINFO*)ptv->itemNew.lParam;
  1371.     }
  1372.  
  1373.     if (pni && pni->Callback)
  1374.     {
  1375.         pni->Callback(pni->lParam1, pni->lParam2);
  1376.     }
  1377.  
  1378.     SendMessage(g_hwndLV, WM_SETREDRAW, TRUE, 0);
  1379.     InvalidateRect(g_hwndLV, NULL, TRUE);
  1380. }
  1381.  
  1382. //================================================================
  1383. //================================================================
  1384. void DXView_OnListViewDblClick(HWND hwndLV, NM_LISTVIEW *plv)
  1385. {
  1386.     LV_ITEM lvi;
  1387.  
  1388.     lvi.mask   = LVIF_PARAM;
  1389.     lvi.lParam = 0;
  1390.     lvi.iItem  = plv->iItem;
  1391.     ListView_GetItem(hwndLV, &lvi);
  1392. }
  1393.  
  1394.  
  1395. //================================================================
  1396. //================================================================
  1397. void DXView_OnCommand(HWND hwnd, WPARAM wParam)
  1398. {
  1399.     HMENU hMenu;
  1400.  
  1401.     switch(LOWORD(wParam))
  1402.     {
  1403.         case IDM_VIEWAVAIL:
  1404.         case IDM_VIEWALL:
  1405.             hMenu = GetMenu(hwnd);
  1406.             CheckMenuItem(hMenu, g_dwViewState, MF_BYCOMMAND | MF_UNCHECKED);
  1407.             g_dwViewState = LOWORD(wParam);
  1408.             CheckMenuItem(hMenu, g_dwViewState, MF_BYCOMMAND | MF_CHECKED);
  1409.             DXView_OnTreeSelect(g_hwndTV, NULL);
  1410.             break;
  1411.  
  1412.         case IDM_ABOUT:
  1413.             DialogBox(g_hInstance, "About", hwnd, (DLGPROC)About);
  1414.             break;
  1415.  
  1416.         case IDM_EXIT:
  1417.             PostMessage(hwnd, WM_CLOSE, 0, 0);
  1418.             break;
  1419.     }
  1420. }
  1421.  
  1422. //================================================================
  1423. //================================================================
  1424. void DXView_Cleanup()
  1425. {
  1426.     if (lpDD)
  1427.         IDirectDraw_Release(lpDD);
  1428.  
  1429.     if (lpDS)
  1430.         IDirectSound_Release(lpDS);
  1431.  
  1432.     if (lpDP)
  1433.         lpDP->lpVtbl->Release(lpDP);
  1434.  
  1435.     if(g_hImageList)
  1436.         ImageList_Destroy(g_hImageList);
  1437. }
  1438.  
  1439. //================================================================
  1440. //================================================================
  1441. BOOL DXView_InitImageList()
  1442. {
  1443.     int cxSmIcon;
  1444.     int cySmIcon;
  1445.     UINT Index;
  1446.     HICON hIcon;
  1447.  
  1448.     if (g_hImageList)
  1449.         return TRUE;
  1450.  
  1451.     cxSmIcon = GetSystemMetrics(SM_CXSMICON);
  1452.     cySmIcon = GetSystemMetrics(SM_CYSMICON);
  1453.  
  1454.     //  First, create the image list that is needed.
  1455.     if((g_hImageList = ImageList_Create(cxSmIcon, cySmIcon, TRUE, IDI_LASTIMAGE - IDI_FIRSTIMAGE, 10)) == NULL)
  1456.         return(FALSE);
  1457.  
  1458.     //
  1459.     //  Initialize the image list with all of the icons that we'll be using
  1460.     //  Once set, send its handle to all interested child windows.
  1461.     //
  1462.     for (Index = IDI_FIRSTIMAGE; Index <= IDI_LASTIMAGE; Index++)
  1463.     {
  1464.         hIcon = LoadImage(g_hInstance, MAKEINTRESOURCE(Index), IMAGE_ICON, cxSmIcon, cySmIcon, 0);
  1465.         ImageList_AddIcon(g_hImageList, hIcon);
  1466.         DestroyIcon(hIcon);
  1467.     }
  1468.  
  1469.     TreeView_SetImageList(g_hwndTV, g_hImageList, TVSIL_NORMAL);
  1470.  
  1471.     return(TRUE);
  1472. }
  1473.  
  1474. //================================================================
  1475. //================================================================
  1476. HRESULT CALLBACK DDEnumCallBack(GUID *pid, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext)
  1477. {
  1478.     HTREEITEM hParent = (HTREEITEM)lpContext;
  1479.     TCHAR szText[256];
  1480.     HRESULT ddrval;
  1481.  
  1482.     if (HIWORD(pid) != 0)
  1483.     {
  1484.         GUID temp = *pid;
  1485.         pid = (GUID *)LocalAlloc(LPTR, sizeof(GUID));
  1486.         *pid = temp;
  1487.     }
  1488.  
  1489.     // Add subnode to treeview
  1490.     if (lpDriverName && *lpDriverName)
  1491.         wsprintf(szText, "%s (%s)", lpDriverDesc, lpDriverName);
  1492.     else
  1493.         lstrcpy(szText, lpDriverDesc);
  1494.     {
  1495.         DDCAPS DDCaps;
  1496.         lpDD = DDCreate(pid);
  1497.         DDCaps.dwSize = sizeof(DDCAPS);
  1498.         ddrval = lpDD->lpVtbl->GetCaps(lpDD, &DDCaps,NULL);
  1499.         if(ddrval == DD_OK)
  1500.             if(DDCaps.dwSize != 0)
  1501.                 if(DDCaps.ddsCaps.dwCaps & DDSCAPS_3D != 0)
  1502.                     pid_for3D = pid;
  1503.     }
  1504.     DDCapDefs[0].szName = szText;
  1505.     AddCapsToTV(hParent, DDCapDefs, (LPARAM)pid);
  1506.  
  1507.     return(DDENUMRET_OK);
  1508. }
  1509.  
  1510. //================================================================
  1511. //================================================================
  1512. HRESULT CALLBACK DSEnumCallBack(GUID *pid, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext)
  1513. {
  1514.     HTREEITEM hParent = (HTREEITEM)lpContext;
  1515.     TCHAR szText[256];
  1516.  
  1517.     if (HIWORD(pid) != 0)
  1518.     {
  1519.         GUID temp = *pid;
  1520.         pid = (GUID *)LocalAlloc(LPTR, sizeof(GUID));
  1521.         *pid = temp;
  1522.     }
  1523.  
  1524.     // Add subnode to treeview
  1525.     if (lpDriverName && *lpDriverName)
  1526.         wsprintf(szText, "%s (%s)", lpDriverDesc, lpDriverName);
  1527.     else
  1528.         lstrcpy(szText, lpDriverDesc);
  1529.  
  1530.     DSCapDefs[0].szName = szText;
  1531.     AddCapsToTV(hParent, DSCapDefs, (LPARAM)pid);
  1532.  
  1533.     return(DDENUMRET_OK);
  1534. }
  1535.  
  1536. //================================================================
  1537. //================================================================
  1538. BOOL CALLBACK DPEnumCallback(GUID *pid, LPSTR szName, DWORD major_ver, DWORD minor_ver, LPVOID lpContext)
  1539. {
  1540.     HTREEITEM hParent = (HTREEITEM)lpContext;
  1541.     TCHAR szText[256];
  1542.  
  1543.     if (HIWORD(pid) != 0)
  1544.     {
  1545.         GUID temp = *pid;
  1546.         pid = (GUID *)LocalAlloc(LPTR, sizeof(GUID));
  1547.         *pid = temp;
  1548.     }
  1549.  
  1550.     wsprintf(szText, "%s %d.%d", szName, major_ver, minor_ver);
  1551.  
  1552.     DPCapDefs[0].szName = szText;
  1553.     AddCapsToTV(hParent, DPCapDefs, (LPARAM)pid);
  1554.  
  1555.     return TRUE;
  1556. }
  1557.  
  1558. //================================================================
  1559. //================================================================
  1560. HRESULT CALLBACK D3EnumCallback(
  1561.             LPGUID pid,
  1562.             LPSTR lpDriverDesc,
  1563.             LPSTR lpDriverName, 
  1564.             LPD3DDEVICEDESC lpD3DDeviceDesc1, 
  1565.             LPD3DDEVICEDESC lpD3DDeviceDesc2, 
  1566.             LPVOID lpContext)
  1567. {
  1568.     HTREEITEM hParent = (HTREEITEM)lpContext;
  1569.     TCHAR szText[256];
  1570.  
  1571.     //Store this info now is much easier than recreating it later.
  1572.     CAP3DDEVICEDESC *temp;
  1573.     if(lpD3DDeviceDesc1->dwFlags != 0)
  1574.     {
  1575.         temp = LocalAlloc(LPTR, sizeof(CAP3DDEVICEDESC));
  1576.         memcpy(temp,lpD3DDeviceDesc1,sizeof(CAP3DDEVICEDESC));
  1577.     }else
  1578.     {
  1579.         temp = LocalAlloc(LPTR, sizeof(CAP3DDEVICEDESC));
  1580.         memcpy(temp,lpD3DDeviceDesc2,sizeof(CAP3DDEVICEDESC));
  1581.     }
  1582.     memcpy(&temp->guid,pid,sizeof(GUID));
  1583.  
  1584.     // Add subnode to treeview
  1585.     if (lpDriverName && *lpDriverName)
  1586.         wsprintf(szText, "%s (%s)", lpDriverDesc, lpDriverName);
  1587.     else
  1588.         lstrcpy(szText, lpDriverDesc);
  1589.  
  1590.     D3CapDefs[0].szName = szText;
  1591.     AddCapsToTV(hParent, D3CapDefs, (LPARAM)temp);
  1592.  
  1593.     return(DDENUMRET_OK);
  1594. }
  1595.  
  1596. //================================================================
  1597. //================================================================
  1598. HRESULT Direct3DEnumerate(LPD3DENUMDEVICESCALLBACK lp3DEnumCallback, LPVOID lpVoid)
  1599. {
  1600.     TCHAR szText[256];
  1601.     HRESULT ddrval;
  1602.  
  1603.     if (lpDD)
  1604.     {
  1605.         IDirectDraw_Release(lpDD);
  1606.         lpDD = NULL;
  1607.     }
  1608.     if((ddrval = DirectDrawCreate(pid_for3D, &lpDD, NULL)) != DD_OK)
  1609.     {
  1610.         wsprintf(szText, "Error %x",ddrval);
  1611.         OutputDebugString(szText);
  1612.     }
  1613.     ddrval = IDirectDraw_QueryInterface(lpDD,&IID_IDirect3D,&lp3D);
  1614.     if ((ddrval == DD_OK)&&(lp3D != NULL))
  1615.     {
  1616.         IDirect3D_EnumDevices(lp3D, lp3DEnumCallback, lpVoid);
  1617.     }
  1618.     return(DDENUMRET_OK);
  1619.     
  1620. }
  1621.  
  1622. //================================================================
  1623. //================================================================
  1624. void DXView_FillTree(HWND hwndTV)
  1625. {
  1626.     HTREEITEM hTree;
  1627.  
  1628.     // Add direct draw devices
  1629.  
  1630.     hTree = TVAddNode(TVI_ROOT, "DirectDraw Devices", TRUE,
  1631.         IDI_DIRECTX, NULL, 0, 0);
  1632.  
  1633.     // Add Display Driver node(s) and capability nodes to treeview
  1634.     DirectDrawEnumerate(DDEnumCallBack, hTree);
  1635.  
  1636.     // Add Hardware Emulation Layer node to treeview
  1637.     DDEnumCallBack((GUID *)DDCREATE_EMULATIONONLY, "Hardware Emulation Layer", NULL, (LPVOID)hTree);
  1638.  
  1639.     TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND);
  1640.     TreeView_SelectItem(g_hwndTV, hTree);
  1641.  
  1642.     // Add direct sound devices
  1643.  
  1644.     hTree = TVAddNode(TVI_ROOT, "DirectSound Devices", TRUE,
  1645.         IDI_DIRECTX, NULL, 0, 0);
  1646.  
  1647.     DirectSoundEnumerate(DSEnumCallBack, hTree);
  1648.  
  1649.     TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND);
  1650.  
  1651.     // Add direct play devices
  1652.  
  1653.     hTree = TVAddNode(TVI_ROOT, "DirectPlay Devices", TRUE,
  1654.         IDI_DIRECTX, NULL, 0, 0);
  1655.  
  1656.     DirectPlayEnumerate(DPEnumCallback, hTree);
  1657.     TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND);
  1658.  
  1659.     // Add direct 3D devices
  1660.  
  1661.     hTree = TVAddNode(TVI_ROOT, "Direct3D Devices", TRUE,
  1662.         IDI_DIRECTX, NULL, 0, 0);
  1663.  
  1664.     Direct3DEnumerate(D3EnumCallback, hTree); //This is not a real 3D function
  1665.     TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND);
  1666.  
  1667.         
  1668. }
  1669.  
  1670. //================================================================
  1671. //  About - process about box
  1672. //================================================================
  1673. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  1674. {
  1675.     switch(message)
  1676.     {
  1677.         case WM_INITDIALOG:
  1678.             return(TRUE);
  1679.  
  1680.         case WM_COMMAND:                      // message: received a command
  1681.             if(LOWORD(wParam) == IDOK        // "OK" box selected?
  1682.             || LOWORD(wParam) == IDCANCEL) {  // System menu close command?
  1683.                 EndDialog(hDlg, TRUE);        // Exit the dialog
  1684.                 return(TRUE);
  1685.             }
  1686.             break;
  1687.     }
  1688.     return(FALSE); // Didn't process the message
  1689. }
  1690.  
  1691. //================================================================
  1692. //================================================================
  1693. //  DXView_OnSize
  1694. //
  1695. //  DESCRIPTION:
  1696. //     Called whenever the size of the app window has changed or the size
  1697. //     of its child controls should be adjusted.
  1698. //
  1699. //  PARAMETERS:
  1700. //     hWnd, handle of app window.
  1701. //
  1702. //================================================================
  1703. //================================================================
  1704. void DXView_OnSize(HWND hWnd)
  1705. {
  1706.     HDWP hDWP;
  1707.     RECT ClientRect;
  1708.     int Height;
  1709.     HWND hKeyTreeWnd;
  1710.     HWND hValueListWnd;
  1711.     int x;
  1712.     int dx;
  1713.  
  1714.     if (IsIconic(hWnd))
  1715.         return;
  1716.  
  1717.     if ((hDWP = BeginDeferWindowPos(2)) != NULL)
  1718.     {
  1719.         //  Data structure used when calling GetEffectiveClientRect (which takes into
  1720.         //  account space taken up by the toolbars/status bars).  First half of the
  1721.         //  pair is zero when at the end of the list, second half is the control id.
  1722.         int s_EffectiveClientRectData[] = {
  1723.             1, 0,                               //  For the menu bar, but is unused
  1724.             0, 0                                //  First zero marks end of data
  1725.         };
  1726.  
  1727.         GetEffectiveClientRect(hWnd, &ClientRect, s_EffectiveClientRectData);
  1728.         Height = ClientRect.bottom - ClientRect.top;
  1729.  
  1730.         hKeyTreeWnd = g_hwndTV;
  1731.  
  1732.         DeferWindowPos(hDWP, hKeyTreeWnd, NULL, 0, ClientRect.top, g_xPaneSplit,
  1733.             Height, SWP_NOZORDER | SWP_NOACTIVATE);
  1734.  
  1735.         x = g_xPaneSplit + GetSystemMetrics(SM_CXSIZEFRAME);
  1736.         dx = ClientRect.right - ClientRect.left - x;
  1737.  
  1738.         hValueListWnd = g_hwndLV;
  1739.  
  1740.         DeferWindowPos(hDWP, hValueListWnd, NULL, x, ClientRect.top, dx, Height,
  1741.             SWP_NOZORDER | SWP_NOACTIVATE);
  1742.  
  1743.         EndDeferWindowPos(hDWP);
  1744.     }
  1745. }
  1746. #ifdef _X86_
  1747. #pragma optimize("", off)
  1748. #endif
  1749. /*----------------------------------------------------------------------------*\
  1750. \*----------------------------------------------------------------------------*/
  1751.  
  1752. void LVAddColumn(HWND hwndLV, int i, char *name, int width)
  1753. {
  1754.     LV_COLUMN col;
  1755.  
  1756.     if (i == 0)
  1757.     {
  1758.         while(ListView_DeleteColumn(hwndLV, 0))
  1759.             ;
  1760.     }
  1761.  
  1762.     col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
  1763.     col.fmt  = LVCFMT_LEFT;
  1764.     col.pszText = name;
  1765.     col.cchTextMax = 0;
  1766.     col.cx = width * g_tmAveCharWidth;
  1767.     col.iSubItem = 0;
  1768.     ListView_InsertColumn(hwndLV, i, &col);
  1769. }
  1770.  
  1771. /*----------------------------------------------------------------------------*\
  1772. \*----------------------------------------------------------------------------*/
  1773. int LVAddText(HWND hwndLV, int col, char *sz, ...)
  1774. {
  1775.     LV_ITEM lvi;
  1776.     char    ach[80];
  1777.     va_list vl;
  1778.  
  1779.     va_start(vl, sz );
  1780.     wvsprintf(ach,sz, vl);
  1781.  
  1782.     lvi.mask        = LVIF_TEXT;
  1783.     lvi.iSubItem    = 0;
  1784.     lvi.state       = 0;
  1785.     lvi.stateMask   = 0;
  1786.     lvi.pszText     = ach;
  1787.     lvi.cchTextMax  = 0;
  1788.     lvi.iImage      = 0;
  1789.     lvi.lParam      = 0;
  1790.  
  1791.     if (col == 0)
  1792.     {
  1793.             lvi.iItem    = 0x7FFF;
  1794.             lvi.iSubItem = 0;
  1795.         return ListView_InsertItem(hwndLV, &lvi);
  1796.     }
  1797.     else
  1798.     {
  1799.         lvi.iItem    = ListView_GetItemCount(hwndLV)-1;
  1800.         lvi.iSubItem = col;
  1801.         return ListView_SetItem(hwndLV, &lvi);
  1802.     }
  1803.     va_end(vl);
  1804. }
  1805.  
  1806. /*----------------------------------------------------------------------------*\
  1807. \*----------------------------------------------------------------------------*/
  1808. HTREEITEM TVAddNode(HTREEITEM hParent, LPSTR szText, BOOL fKids, int iImage, SELCALLBACK Callback, LPARAM lParam1, LPARAM lParam2)
  1809. {
  1810.     TV_INSERTSTRUCT tvi;
  1811.     NODEINFO *pni;
  1812.  
  1813.     pni = (NODEINFO *)LocalAlloc(LPTR, sizeof(NODEINFO));
  1814.  
  1815.     if (pni == NULL)
  1816.         return NULL;
  1817.  
  1818.     pni->lParam1  = lParam1;
  1819.     pni->lParam2  = lParam2;
  1820.     pni->Callback = Callback;
  1821.  
  1822.     // Add Node to treeview
  1823.     tvi.hParent             = hParent;
  1824.     tvi.hInsertAfter        = TVI_LAST;
  1825.     tvi.item.mask           = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_CHILDREN;
  1826.     tvi.item.iImage         = iImage - IDI_FIRSTIMAGE;
  1827.     tvi.item.iSelectedImage = iImage - IDI_FIRSTIMAGE;
  1828.     tvi.item.lParam         = (LPARAM)pni;
  1829.     tvi.item.cChildren      = fKids;
  1830.     tvi.item.pszText        = szText;
  1831.  
  1832.     return TreeView_InsertItem(g_hwndTV, &tvi);
  1833. }
  1834. #ifdef _X86_
  1835. #pragma optimize("", on)
  1836. #endif
  1837.  
  1838.