顯示具有 MSDN 標籤的文章。 顯示所有文章
顯示具有 MSDN 標籤的文章。 顯示所有文章

8.12.2010

Modify DDCAPS for CE 6.0

DDCAPS 是 platform builder 提供,偵測 platform 支援 directdraw 的程度。
但是 CE 6.0 後,DirectDraw interface 大幅改變,所以這個 code 就不能用了。要修改後才行。

修改後的 code:

Index: ddcaps.c
===================================================================
--- ddcaps.c (revision 23142)
+++ ddcaps.c (working copy)
@@ -74,7 +74,7 @@
LPDWORD caps;
LPCAPSDEFSTYPE defs;

-} gCaps[10];
+} gCaps[12];

struct
{
@@ -102,131 +102,83 @@
LPDIRECTDRAW lpDD; // DirectDraw object

// Map caps bits to readable strings
-CAPSDEFSTYPE ddCapsDefs[MAX_BOXES] =
-{
- {TEXT("3D"), DDCAPS_3D},
- {TEXT("ALIGNBOUNDARYDEST"), DDCAPS_ALIGNBOUNDARYDEST},
- {TEXT("ALIGNSIZEDEST"), DDCAPS_ALIGNSIZEDEST},
- {TEXT("ALIGNBOUNDARYSRC"), DDCAPS_ALIGNBOUNDARYSRC},
- {TEXT("ALIGNSIZESRC"), DDCAPS_ALIGNSIZESRC},
- {TEXT("ALIGNSTRIDE"), DDCAPS_ALIGNSTRIDE},
- {TEXT("BLT"), DDCAPS_BLT},
- {TEXT("BLTQUEUE"), DDCAPS_BLTQUEUE},
- {TEXT("BLTFOURCC"), DDCAPS_BLTFOURCC},
- {TEXT("BLTSTRETCH"), DDCAPS_BLTSTRETCH},
- {TEXT("GDI"), DDCAPS_GDI},
- {TEXT("OVERLAY"), DDCAPS_OVERLAY},
- {TEXT("OVERLAYCANTCLIP"), DDCAPS_OVERLAYCANTCLIP},
- {TEXT("OVERLAYFOURCC"), DDCAPS_OVERLAYFOURCC},
- {TEXT("OVERLAYSTRETCH"), DDCAPS_OVERLAYSTRETCH},
- {TEXT("PALETTE"), DDCAPS_PALETTE},
- {TEXT("PALETTEVSYNC"), DDCAPS_PALETTEVSYNC},
- {TEXT("READSCANLINE"), DDCAPS_READSCANLINE},
- {TEXT("STEREOVIEW"), DDCAPS_STEREOVIEW},
- {TEXT("VBI"), DDCAPS_VBI},
- {TEXT("ZBLTS"), DDCAPS_ZBLTS},
- {TEXT("ZOVERLAYS"), DDCAPS_ZOVERLAYS},
- {TEXT("COLORKEY"), DDCAPS_COLORKEY},
- {TEXT("ALPHA"), DDCAPS_ALPHA},
- {TEXT("CKEYHWASSIST"), DDCAPS_COLORKEYHWASSIST},
- {TEXT("NOHARDWARE"), DDCAPS_NOHARDWARE},
- {TEXT("BLTCOLORFILL"), DDCAPS_BLTCOLORFILL},
- {TEXT("BANKSWITCHED"), DDCAPS_BANKSWITCHED},
- {TEXT("BLTDEPTHFILL"), DDCAPS_BLTDEPTHFILL},
- {TEXT("CANCLIP"), DDCAPS_CANCLIP},
- {TEXT("CANCLIPSTRETCHED"), DDCAPS_CANCLIPSTRETCHED},
-};

+
CAPSDEFSTYPE CKeyCapsDefs[MAX_BOXES] =
{
- {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT},
- {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE},
+ {TEXT("BOTHBLT"), DDCKEYCAPS_BOTHBLT},
+ {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT },
+ {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE },
{TEXT("DESTBLTCLRSPACEYUV"), DDCKEYCAPS_DESTBLTCLRSPACEYUV},
- {TEXT("DESTBLTYUV"), DDCKEYCAPS_DESTBLTYUV},
- {TEXT("DESTOVERLAY"), DDCKEYCAPS_DESTOVERLAY},
- {TEXT("DESTOVERLAYCLRSPACE"), DDCKEYCAPS_DESTOVERLAYCLRSPACE},
- {TEXT("DESTOVERLAYCLRSPACEYUV"), DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV},
- {TEXT("DESTOVERLAYONEACTIVE"), DDCKEYCAPS_DESTOVERLAYONEACTIVE},
- {TEXT("DESTOVERLAYYUV"), DDCKEYCAPS_DESTOVERLAYYUV},
- {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT},
+ {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT },
{TEXT("SRCBLTCLRSPACE"), DDCKEYCAPS_SRCBLTCLRSPACE},
- {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV},
- {TEXT("SRCBLTYUV"), DDCKEYCAPS_SRCBLTYUV},
- {TEXT("SRCOVERLAY"), DDCKEYCAPS_SRCOVERLAY},
- {TEXT("SRCOVERLAYCLRSPACE"), DDCKEYCAPS_SRCOVERLAYCLRSPACE},
- {TEXT("SRCOVERLAYCLRSPACEYUV"), DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV},
- {TEXT("SRCOVERLAYONEACTIVE"), DDCKEYCAPS_SRCOVERLAYONEACTIVE},
- {TEXT("SRCOVERLAYYUV"), DDCKEYCAPS_SRCOVERLAYYUV}
+ {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV },
};

-CAPSDEFSTYPE FXCapsDefs[MAX_BOXES] =
-{
- { TEXT("BLTARITHSTRETCHY"), DDFXCAPS_BLTARITHSTRETCHY },
- { TEXT("BLTARITHSTRETCHYN"), DDFXCAPS_BLTARITHSTRETCHYN },
- { TEXT("BLTMIRRORLEFTRIGHT"), DDFXCAPS_BLTMIRRORLEFTRIGHT },
- { TEXT("BLTMIRRORUPDOWN"), DDFXCAPS_BLTMIRRORUPDOWN },
- { TEXT("BLTROTATION"), DDFXCAPS_BLTROTATION },
- { TEXT("BLTROTATION90"), DDFXCAPS_BLTROTATION90 },
- { TEXT("BLTSHRINKX"), DDFXCAPS_BLTSHRINKX },
- { TEXT("BLTSHRINKXN"), DDFXCAPS_BLTSHRINKXN },
- { TEXT("BLTSHRINKY"), DDFXCAPS_BLTSHRINKY },
- { TEXT("BLTSHRINKYN"), DDFXCAPS_BLTSHRINKYN },
- { TEXT("BLTSTRETCHX"), DDFXCAPS_BLTSTRETCHX },
- { TEXT("BLTSTRETCHXN"), DDFXCAPS_BLTSTRETCHXN },
- { TEXT("BLTSTRETCHY"), DDFXCAPS_BLTSTRETCHY },
- { TEXT("BLTSTRETCHYN"), DDFXCAPS_BLTSTRETCHYN },
- { TEXT("OVERLAYARITHSTRETCHY"), DDFXCAPS_OVERLAYARITHSTRETCHY },
- { TEXT("OVERLAYARITHSTRETCHYN"), DDFXCAPS_OVERLAYARITHSTRETCHYN },
- { TEXT("OVERLAYSHRINKX"), DDFXCAPS_OVERLAYSHRINKX },
- { TEXT("OVERLAYSHRINKXN"), DDFXCAPS_OVERLAYSHRINKXN },
- { TEXT("OVERLAYSHRINKY"), DDFXCAPS_OVERLAYSHRINKY },
- { TEXT("OVERLAYSHRINKYN"), DDFXCAPS_OVERLAYSHRINKYN },
- { TEXT("OVERLAYSTRETCHX"), DDFXCAPS_OVERLAYSTRETCHX },
- { TEXT("OVERLAYSTRETCHXN"), DDFXCAPS_OVERLAYSTRETCHXN },
- { TEXT("OVERLAYSTRETCHY"), DDFXCAPS_OVERLAYSTRETCHY },
- { TEXT("OVERLAYSTRETCHYN"), DDFXCAPS_OVERLAYSTRETCHYN },
- { TEXT("OVERLAYMIRRORLEFTRIGHT"), DDFXCAPS_OVERLAYMIRRORLEFTRIGHT },
- { TEXT("OVERLAYMIRRORUPDOWN"), DDFXCAPS_OVERLAYMIRRORUPDOWN },
-};
-
CAPSDEFSTYPE PalCapsDefs[MAX_BOXES] =
{
- {TEXT("1BIT"), DDPCAPS_1BIT},
- {TEXT("2BIT"), DDPCAPS_2BIT},
- {TEXT("4BIT"), DDPCAPS_4BIT},
- {TEXT("8BITENTRIES"), DDPCAPS_8BITENTRIES},
- {TEXT("8BIT"), DDPCAPS_8BIT},
- {TEXT("ALLOW256"), DDPCAPS_ALLOW256},
- {TEXT("INITIALIZE"), DDPCAPS_INITIALIZE},
+ {TEXT("ALPHA"), DDPCAPS_ALPHA},
{TEXT("PRIMARYSURFACE"), DDPCAPS_PRIMARYSURFACE},
- {TEXT("PRIMARYSURFACELEFT"), DDPCAPS_PRIMARYSURFACELEFT},
- {TEXT("VSYNC"), DDPCAPS_VSYNC}
-};
+ };

-CAPSDEFSTYPE SurfCapsDefs[MAX_BOXES] =
+CAPSDEFSTYPE BltCapsDefs[MAX_BOXES] =
{
- {TEXT("3DDEVICE"), DDSCAPS_3DDEVICE},
- {TEXT("ALPHA"), DDSCAPS_ALPHA},
- {TEXT("BACKBUFFER"), DDSCAPS_BACKBUFFER},
- {TEXT("COMPLEX"), DDSCAPS_COMPLEX},
- {TEXT("FLIP"), DDSCAPS_FLIP},
- {TEXT("FRONTBUFFER"), DDSCAPS_FRONTBUFFER},
- {TEXT("MIPMAP"), DDSCAPS_MIPMAP},
- {TEXT("OFFSCREENPLAIN"), DDSCAPS_OFFSCREENPLAIN},
- {TEXT("OVERLAY"), DDSCAPS_OVERLAY},
- {TEXT("PALETTE"), DDSCAPS_PALETTE},
- {TEXT("PRIMARYSURFACE"), DDSCAPS_PRIMARYSURFACE},
- {TEXT("PRIMARYSURFACELEFT"), DDSCAPS_PRIMARYSURFACELEFT},
- {TEXT("SYSTEMMEMORY"), DDSCAPS_SYSTEMMEMORY},
- {TEXT("TEXTURE"), DDSCAPS_TEXTURE},
- {TEXT("VIDEOMEMORY"), DDSCAPS_VIDEOMEMORY},
- {TEXT("VISIBLE"), DDSCAPS_VISIBLE},
- {TEXT("WRITEONLY"), DDSCAPS_WRITEONLY},
- {TEXT("ZBUFFER"), DDSCAPS_ZBUFFER}
-};
+ { TEXT("READSYSMEM"), DDBLTCAPS_READSYSMEM },
+ { TEXT("WRITESYSMEM"), DDBLTCAPS_WRITESYSMEM },
+ { TEXT("FOURCCTORGB"), DDBLTCAPS_FOURCCTORGB },
+ { TEXT("COPYFOURCC"), DDBLTCAPS_COPYFOURCC },
+ { TEXT("FILLFOURCC"), DDBLTCAPS_FILLFOURCC },
+ };

+CAPSDEFSTYPE AlphaCapsDefs[MAX_BOXES] =
+{
+ { TEXT("ALPHAPIXELS"), DDALPHACAPS_ALPHAPIXELS },
+ { TEXT("PREMULT"), DDALPHACAPS_PREMULT },
+ { TEXT("NONPREMULT"), DDALPHACAPS_NONPREMULT },
+ { TEXT("ALPHAFILL"), DDALPHACAPS_ALPHAFILL },
+ { TEXT("ALPHANEG"), DDALPHACAPS_ALPHANEG },
+ };

+CAPSDEFSTYPE OverlayCapsDefs[MAX_BOXES] =
+{
+ {TEXT("FLIP"), DDOVERLAYCAPS_FLIP},
+ {TEXT("FOURCC"), DDOVERLAYCAPS_FOURCC},
+ {TEXT("ZORDER"), DDOVERLAYCAPS_ZORDER},
+ {TEXT("MIRRORLEFTRIGHT"), DDOVERLAYCAPS_MIRRORLEFTRIGHT},
+ {TEXT("MIRRORUPDOWN"), DDOVERLAYCAPS_MIRRORUPDOWN},
+ {TEXT("CKEYSRC"), DDOVERLAYCAPS_CKEYSRC},
+ {TEXT("CKEYSRCCLRSPACE"), DDOVERLAYCAPS_CKEYSRCCLRSPACE},
+ {TEXT("CKEYSRCCLRSPACEYUV"), DDOVERLAYCAPS_CKEYSRCCLRSPACEYUV},
+ {TEXT("CKEYDEST"), DDOVERLAYCAPS_CKEYDEST},
+ {TEXT("CKEYDESTCLRSPACE"), DDOVERLAYCAPS_CKEYDESTCLRSPACE},
+ {TEXT("CKEYDESTCLRSPACEYUV"), DDOVERLAYCAPS_CKEYDESTCLRSPACEYUV},
+ {TEXT("CKEYBOTH"), DDOVERLAYCAPS_CKEYBOTH},
+ {TEXT("ALPHADEST"), DDOVERLAYCAPS_ALPHADEST},
+ {TEXT("ALPHASRC"), DDOVERLAYCAPS_ALPHASRC},
+ {TEXT("ALPHADESTNEG"), DDOVERLAYCAPS_ALPHADESTNEG},
+ {TEXT("ALPHASRCNEG"), DDOVERLAYCAPS_ALPHASRCNEG},
+ {TEXT("ALPHACONSTANT"), DDOVERLAYCAPS_ALPHACONSTANT},
+ {TEXT("ALPHAPREMULT"), DDOVERLAYCAPS_ALPHAPREMULT},
+ {TEXT("ALPHANONPREMULT"), DDOVERLAYCAPS_ALPHANONPREMULT},
+ {TEXT("ALPHAANDKEYDEST"), DDOVERLAYCAPS_ALPHAANDKEYDEST},
+ {TEXT("OVERLAYSUPPORT"), DDOVERLAYCAPS_OVERLAYSUPPORT},
+ };

+ CAPSDEFSTYPE MiscCapsDefs[MAX_BOXES] =
+{
+ {TEXT("READSCANLINE"), DDMISCCAPS_READSCANLINE},
+ {TEXT("READMONITORFREQ"), DDMISCCAPS_READMONITORFREQ},
+ {TEXT("READVBLANKSTATUS"), DDMISCCAPS_READVBLANKSTATUS},
+ {TEXT("FLIPINTERVAL"), DDMISCCAPS_FLIPINTERVAL},
+ {TEXT("FLIPODDEVEN"), DDMISCCAPS_FLIPODDEVEN},
+ {TEXT("FLIPVSYNCWITHVBI"), DDMISCCAPS_FLIPVSYNCWITHVBI},
+ {TEXT("COLORCONTROLOVERLAY"), DDMISCCAPS_COLORCONTROLOVERLAY},
+ {TEXT("COLORCONTROLPRIMARY"), DDMISCCAPS_COLORCONTROLPRIMARY},
+ {TEXT("GAMMACONTROLOVERLAY"), DDMISCCAPS_GAMMACONTROLOVERLAY},
+ {TEXT("GAMMACONTROLPRIMARY"), DDMISCCAPS_GAMMACONTROLPRIMARY}
+ };
+
+
//*------------------------------------------------------------------------
//| Dlg_OnCommand
//*------------------------------------------------------------------------
@@ -254,14 +206,16 @@
int i;
TCHAR szTitle[256];
static TCHAR *rgszCaps[] = {
- TEXT("Direct Draw Caps Bits"),
TEXT("Direct Draw Color Key Caps Bits"),
- TEXT("Direct Draw FX Caps Bits"),
TEXT("Direct Draw Palette Caps Bits"),
- TEXT("Direct Draw Surface Caps Bits")};
+ TEXT("Direct Draw Blt Caps Bits"),
+ TEXT("Direct Draw Alpha Caps Bits"),
+ TEXT("Direct Draw Overlay Caps Bits"),
+ TEXT("Direct Draw Misc Caps Bits")
+ };

- wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%5],
- (Which < 5) ? TEXT("HAL") : TEXT("HEL"));
+ wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%6],
+ (Which < 6) ? TEXT("HAL") : TEXT("HEL"));
SetWindowText(hwnd, szTitle);

ShowWindow(GetDlgItem(hwnd, IDC_RESTORE), SW_HIDE);
@@ -285,11 +239,8 @@
return TRUE;
}

-//*------------------------------------------------------------------------
-//| ddCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-ddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

@@ -306,11 +257,8 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| CKeyCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

@@ -327,15 +275,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| SurfCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-SurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+BltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 4;
+ Which = 2;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -348,15 +293,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| FXCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-FXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+AlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 2;
+ Which = 3;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -370,15 +312,12 @@
}


-//*------------------------------------------------------------------------
-//| PalCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+OverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 3;
+ Which = 4;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -391,12 +330,8 @@
return (fProcessed);
}

-
-//*------------------------------------------------------------------------
-//| HELddCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-HELddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+MiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

@@ -413,9 +348,7 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| HELCKeyCapsDlg_Proc
-//*------------------------------------------------------------------------
+
BOOL CALLBACK
HELCKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@@ -434,15 +367,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| HELSurfCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-HELSurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 9;
+ Which = 7;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -455,15 +385,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| HELFXCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-HELFXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+HELBltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 7;
+ Which = 8;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -476,16 +403,31 @@
return (fProcessed);
}

+BOOL CALLBACK
+HELAlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL fProcessed = TRUE;

-//*------------------------------------------------------------------------
-//| HELPalCapsDlg_Proc
-//*------------------------------------------------------------------------
+ Which = 9;
+ switch (uMsg)
+ {
+ HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
+ HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);
+
+ default:
+ fProcessed = FALSE;
+ break;
+ }
+ return (fProcessed);
+}
+
+
BOOL CALLBACK
-HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+HELOverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 8;
+ Which = 10;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -498,7 +440,24 @@
return (fProcessed);
}

+BOOL CALLBACK
+HELMiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL fProcessed = TRUE;

+ Which = 11;
+ switch (uMsg)
+ {
+ HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
+ HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);
+
+ default:
+ fProcessed = FALSE;
+ break;
+ }
+ return (fProcessed);
+}
+
//*------------------------------------------------------------------------
//| DDEnumCallback
//*------------------------------------------------------------------------
@@ -539,7 +498,7 @@
//*------------------------------------------------------------------------
static int gCurMode = 0;

-DWORD DDAPI
+DWORD CALLBACK
EnumModesCallback(LPDDSURFACEDESC pddsd, LPVOID context)
{
Modes[ModeCnt].dwWidth = pddsd->dwWidth;
@@ -568,6 +527,8 @@
//| nCmdShow - Integer value specifying how to start app.,
//| (Iconic [7] or Normal [1,5])
//*------------------------------------------------------------------------
+typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEX)(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags);
+
int WINAPI
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
@@ -586,22 +547,22 @@

// You need to do a GetModuleHandle and GetProcAddress in order to get the
// DirectDrawEnumerateEx
- hDDrawDLL = GetModuleHandle(TEXT("DDRAW"));
+ hDDrawDLL = LoadLibrary(TEXT("DDRAW.dll"));
if (!hDDrawDLL)
{
OutputDebugString(TEXT("LoadLibrary() failed - ddcaps: Can't list display modes"));
return (-1);
}
pDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX )
- GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateExW"));
+ GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateEx"));

if (pDirectDrawEnumerateEx)
pDirectDrawEnumerateEx( DDEnumCallbackEx, (LPVOID) NULL,
DDENUM_ATTACHEDSECONDARYDEVICES |
- DDENUM_DETACHEDSECONDARYDEVICES |
- DDENUM_NONDISPLAYDEVICES);
+ DDENUM_DETACHEDSECONDARYDEVICES
+ );
else // Old DirectDraw, so do it the old way
- DirectDrawEnumerate(DDEnumCallback, NULL);
+ MessageBox(NULL,TEXT("EnumerateEx Call Fail"),TEXT("Error"),MB_OK);

ddrval = DirectDrawCreate(gpSelectedDriverGUID, &lpDD, NULL);
if (ddrval != DD_OK)
@@ -635,35 +596,41 @@

lpDD->lpVtbl->GetCaps(lpDD, &ddcapsHAL, &ddcapsHEL);

- gCaps[0].caps = &(ddcapsHAL.dwCaps);
- gCaps[0].defs = ddCapsDefs;
+ gCaps[0].caps = &(ddcapsHAL.dwCKeyCaps);
+ gCaps[0].defs = CKeyCapsDefs;

- gCaps[1].caps = &(ddcapsHAL.dwCKeyCaps);
- gCaps[1].defs = CKeyCapsDefs;
+ gCaps[1].caps = &(ddcapsHAL.dwPalCaps);
+ gCaps[1].defs = PalCapsDefs;

- gCaps[2].caps = &(ddcapsHAL.dwFXCaps);
- gCaps[2].defs = FXCapsDefs;
+ gCaps[2].caps = &(ddcapsHAL.dwBltCaps);
+ gCaps[2].defs = BltCapsDefs;

- gCaps[3].caps = &(ddcapsHAL.dwPalCaps);
- gCaps[3].defs = PalCapsDefs;
+ gCaps[3].caps = &(ddcapsHAL.dwAlphaCaps);
+ gCaps[3].defs = AlphaCapsDefs;

- gCaps[4].caps = &(ddcapsHAL.ddsCaps.dwCaps);
- gCaps[4].defs = SurfCapsDefs;
+ gCaps[4].caps = &(ddcapsHAL.dwOverlayCaps);
+ gCaps[4].defs = OverlayCapsDefs;

- gCaps[5].caps = &(ddcapsHEL.dwCaps);
- gCaps[5].defs = ddCapsDefs;
+ gCaps[5].caps = &(ddcapsHAL.dwMiscCaps);
+ gCaps[5].defs = MiscCapsDefs;

gCaps[6].caps = &(ddcapsHEL.dwCKeyCaps);
gCaps[6].defs = CKeyCapsDefs;

- gCaps[7].caps = &(ddcapsHEL.dwFXCaps);
- gCaps[7].defs = FXCapsDefs;
+ gCaps[7].caps = &(ddcapsHEL.dwPalCaps);
+ gCaps[7].defs = PalCapsDefs;

- gCaps[8].caps = &(ddcapsHEL.dwPalCaps);
- gCaps[8].defs = PalCapsDefs;
+ gCaps[8].caps = &(ddcapsHEL.dwBltCaps);
+ gCaps[8].defs = BltCapsDefs;

- gCaps[9].caps = &(ddcapsHEL.ddsCaps.dwCaps);
- gCaps[9].defs = SurfCapsDefs;
+ gCaps[9].caps = &(ddcapsHEL.dwAlphaCaps);
+ gCaps[9].defs = AlphaCapsDefs;
+
+ gCaps[10].caps = &(ddcapsHEL.dwOverlayCaps);
+ gCaps[10].defs = OverlayCapsDefs;
+
+ gCaps[11].caps = &(ddcapsHEL.dwMiscCaps);
+ gCaps[11].defs = MiscCapsDefs;
}


@@ -794,56 +761,63 @@
DialogBox(ghInstance, TEXT("About"), hWnd, (DLGPROC)AboutDlgProc);
break;

- case ID_VIEW_DRIVERCAPS:
- CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, ddCapsDlg_Proc);
- break;
-
+
case ID_VIEW_DRIVERCOLORKEYCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, CKeyCapsDlg_Proc);
break;

- case ID_VIEW_DRIVERFXCAPS:
+ case ID_VIEW_DRIVERPALETTECAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, FXCapsDlg_Proc);
+ NULL, PalCapsDlg_Proc);
break;

- case ID_VIEW_DRIVERPALETTECAPS:
+ case ID_VIEW_DRIVERBLTCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, PalCapsDlg_Proc);
+ NULL, BltCapsDlg_Proc);
break;

- case ID_VIEW_DRIVERSURFACECAPS:
+ case ID_VIEW_DRIVERALPHACAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, SurfCapsDlg_Proc);
+ NULL, AlphaCapsDlg_Proc);
break;

- case ID_VIEW_HELCAPS:
+ case ID_VIEW_DRIVEROVERLAYCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, HELddCapsDlg_Proc);
+ NULL, OverlayCapsDlg_Proc);
break;
+
+ case ID_VIEW_DRIVERMISCCAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, OverlayCapsDlg_Proc);
+ break;

+//----------------
case ID_VIEW_HELCOLORKEYCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, HELCKeyCapsDlg_Proc);
break;

- case ID_VIEW_HELFXCAPS:
- CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, HELFXCapsDlg_Proc);
- break;
-
case ID_VIEW_HELPALETTECAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, HELPalCapsDlg_Proc);
break;
-
- case ID_VIEW_HELSURFACECAPS:
+ case ID_VIEW_HELBLTCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, HELSurfCapsDlg_Proc);
+ NULL, HELBltCapsDlg_Proc);
break;
-
+ case ID_VIEW_HELALPHACAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, HELAlphaCapsDlg_Proc);
+ break;
+ case ID_VIEW_HELOVERLAYCAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, HELOverlayCapsDlg_Proc);
+ break;
+ case ID_VIEW_HELMISCCAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, HELMiscCapsDlg_Proc);
+ break;
case ID_PRINTF_LISTBOX:
if (HIWORD(wParam) == LBN_DBLCLK)
{
@@ -852,18 +826,18 @@
if (sel < (UINT)ModeCnt)
{
ddrval = lpDD->lpVtbl->SetCooperativeLevel(lpDD,
- hWnd,
- DDSCL_EXCLUSIVE |
- DDSCL_NOWINDOWCHANGES |
+ hWnd,
+ DDSCL_NORMAL |
DDSCL_FULLSCREEN);
if (ddrval == DD_OK)
{
ddrval = lpDD->lpVtbl->SetDisplayMode(lpDD,
- Modes[sel].dwWidth,
- Modes[sel].dwHeight,
- Modes[sel].dwBPP);
+ Modes[sel].dwWidth,
+ Modes[sel].dwHeight,
+ Modes[sel].dwBPP,0,0);
ddrval = lpDD->lpVtbl->SetCooperativeLevel(lpDD,
- hWnd, DDSCL_NORMAL);
+ hWnd,
+ DDSCL_NORMAL);
}
}
}
Index: ddcaps.rc
===================================================================
--- ddcaps.rc (revision 23142)
+++ ddcaps.rc (working copy)
@@ -66,19 +66,21 @@
END
POPUP "&Driver"
BEGIN
- MENUITEM "Driver &Caps", ID_VIEW_DRIVERCAPS
MENUITEM "Driver C&olor Key Caps", ID_VIEW_DRIVERCOLORKEYCAPS
- MENUITEM "Driver &FX Caps", ID_VIEW_DRIVERFXCAPS
MENUITEM "Driver &Palette Caps", ID_VIEW_DRIVERPALETTECAPS
- MENUITEM "Driver &Surface Caps", ID_VIEW_DRIVERSURFACECAPS
+ MENUITEM "Driver &Blt Caps", ID_VIEW_DRIVERBLTCAPS
+ MENUITEM "Driver &Alpha Caps", ID_VIEW_DRIVERALPHACAPS
+ MENUITEM "Driver &Overlay Caps", ID_VIEW_DRIVEROVERLAYCAPS
+ MENUITEM "Driver &Misc Caps", ID_VIEW_DRIVERMISCCAPS
END
POPUP "&HEL"
BEGIN
- MENUITEM "HEL &Caps", ID_VIEW_HELCAPS
MENUITEM "HEL C&olor Key Caps", ID_VIEW_HELCOLORKEYCAPS
- MENUITEM "HEL &FX Caps", ID_VIEW_HELFXCAPS
MENUITEM "HEL &Palette Caps", ID_VIEW_HELPALETTECAPS
- MENUITEM "HEL &Surface Caps", ID_VIEW_HELSURFACECAPS
+ MENUITEM "HEL &Blt Caps", ID_VIEW_HELBLTCAPS
+ MENUITEM "HEL &Alpha Caps", ID_VIEW_HELALPHACAPS
+ MENUITEM "HEL &Overlay Caps", ID_VIEW_HELOVERLAYCAPS
+ MENUITEM "HEL &Misc Caps", ID_VIEW_HELMISCCAPS
END
END

@@ -228,7 +230,7 @@
BEGIN
DEFPUSHBUTTON "&OK",IDOK,132,58,50,14
LTEXT "DirectDraw Caps Viewer for Windows CE",-1,15,14,165,8
- LTEXT "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,
+ LTEXT "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,
165,8
LTEXT "Version",-1,15,42,24,8
LTEXT "1.0",-1,40,42,66,8
Index: lbprintf.c
===================================================================
--- lbprintf.c (revision 23142)
+++ lbprintf.c (working copy)
@@ -49,102 +49,8 @@
//
// Error string table
//
-static ERRLIST elErrors[] =
-{
- { DD_OK ,TEXT("DD_OK") },
- { DDERR_ALREADYINITIALIZED ,TEXT("DDERR_ALREADYINITIALIZED")},
- { DDERR_CANNOTATTACHSURFACE ,TEXT("DDERR_CANNOTATTACHSURFACE")},
- { DDERR_CANNOTDETACHSURFACE ,TEXT("DDERR_CANNOTDETACHSURFACE")},
- { DDERR_CURRENTLYNOTAVAIL ,TEXT("DDERR_CURRENTLYNOTAVAIL")},
- { DDERR_EXCEPTION ,TEXT("DDERR_EXCEPTION")},
- { DDERR_GENERIC ,TEXT("DDERR_GENERIC")},
- { DDERR_HEIGHTALIGN ,TEXT("DDERR_HEIGHTALIGN")},
- { DDERR_INCOMPATIBLEPRIMARY ,TEXT("DDERR_INCOMPATIBLEPRIMARY")},
- { DDERR_INVALIDCAPS ,TEXT("DDERR_INVALIDCAPS")},
- { DDERR_INVALIDCLIPLIST ,TEXT("DDERR_INVALIDCLIPLIST")},
- { DDERR_INVALIDMODE ,TEXT("DDERR_INVALIDMODE")},
- { DDERR_INVALIDOBJECT ,TEXT("DDERR_INVALIDOBJECT")},
- { DDERR_INVALIDPARAMS ,TEXT("DDERR_INVALIDPARAMS")},
- { DDERR_INVALIDPIXELFORMAT ,TEXT("DDERR_INVALIDPIXELFORMAT")},
- { DDERR_INVALIDRECT ,TEXT("DDERR_INVALIDRECT")},
- { DDERR_LOCKEDSURFACES ,TEXT("DDERR_LOCKEDSURFACES")},
- { DDERR_NO3D ,TEXT("DDERR_NO3D")},
- { DDERR_NOALPHAHW ,TEXT("DDERR_NOALPHAHW")},
- { DDERR_NOCLIPLIST ,TEXT("DDERR_NOCLIPLIST")},
- { DDERR_NOCOLORCONVHW ,TEXT("DDERR_NOCOLORCONVHW")},
- { DDERR_NOCOOPERATIVELEVELSET ,TEXT("DDERR_NOCOOPERATIVELEVELSET")},
- { DDERR_NOCOLORKEY ,TEXT("DDERR_NOCOLORKEY")},
- { DDERR_NOCOLORKEYHW ,TEXT("DDERR_NOCOLORKEYHW")},
- { DDERR_NOEXCLUSIVEMODE ,TEXT("DDERR_NOEXCLUSIVEMODE")},
- { DDERR_NOFLIPHW ,TEXT("DDERR_NOFLIPHW")},
- { DDERR_NOGDI ,TEXT("DDERR_NOGDI")},
- { DDERR_NOMIRRORHW ,TEXT("DDERR_NOMIRRORHW")},
- { DDERR_NOTFOUND ,TEXT("DDERR_NOTFOUND")},
- { DDERR_NOOVERLAYHW ,TEXT("DDERR_NOOVERLAYHW")},
- { DDERR_NORASTEROPHW ,TEXT("DDERR_NORASTEROPHW")},
- { DDERR_NOROTATIONHW ,TEXT("DDERR_NOROTATIONHW")},
- { DDERR_NOSTRETCHHW ,TEXT("DDERR_NOSTRETCHHW")},
- { DDERR_NOT4BITCOLOR ,TEXT("DDERR_NOT4BITCOLOR")},
- { DDERR_NOT4BITCOLORINDEX ,TEXT("DDERR_NOT4BITCOLORINDEX")},
- { DDERR_NOT8BITCOLOR ,TEXT("DDERR_NOT8BITCOLOR")},
- { DDERR_NOTEXTUREHW ,TEXT("DDERR_NOTEXTUREHW")},
- { DDERR_NOVSYNCHW ,TEXT("DDERR_NOVSYNCHW")},
- { DDERR_NOZBUFFERHW ,TEXT("DDERR_NOZBUFFERHW")},
- { DDERR_NOZOVERLAYHW ,TEXT("DDERR_NOZOVERLAYHW")},
- { DDERR_OUTOFCAPS ,TEXT("DDERR_OUTOFCAPS")},
- { DDERR_OUTOFMEMORY ,TEXT("DDERR_OUTOFMEMORY")},
- { DDERR_OUTOFVIDEOMEMORY ,TEXT("DDERR_OUTOFVIDEOMEMORY")},
- { DDERR_OVERLAYCANTCLIP ,TEXT("DDERR_OVERLAYCANTCLIP")},
- { DDERR_OVERLAYCOLORKEYONLYONEACTIVE,TEXT("DDERR_OVERLAYCOLORKEYONLYONEACTIVE")},
- { DDERR_PALETTEBUSY ,TEXT("DDERR_PALETTEBUSY")},
- { DDERR_COLORKEYNOTSET ,TEXT("DDERR_COLORKEYNOTSET")},
- { DDERR_SURFACEALREADYATTACHED ,TEXT("DDERR_SURFACEALREADYATTACHED")},
- { DDERR_SURFACEALREADYDEPENDENT ,TEXT("DDERR_SURFACEALREADYDEPENDENT")},
- { DDERR_SURFACEBUSY ,TEXT("DDERR_SURFACEBUSY")},
- { DDERR_SURFACEISOBSCURED ,TEXT("DDERR_SURFACEISOBSCURED")},
- { DDERR_SURFACELOST ,TEXT("DDERR_SURFACELOST")},
- { DDERR_SURFACENOTATTACHED ,TEXT("DDERR_SURFACENOTATTACHED")},
- { DDERR_TOOBIGHEIGHT ,TEXT("DDERR_TOOBIGHEIGHT")},
- { DDERR_TOOBIGSIZE ,TEXT("DDERR_TOOBIGSIZE")},
- { DDERR_TOOBIGWIDTH ,TEXT("DDERR_TOOBIGWIDTH")},
- { DDERR_UNSUPPORTED ,TEXT("DDERR_UNSUPPORTED")},
- { DDERR_UNSUPPORTEDFORMAT ,TEXT("DDERR_UNSUPPORTEDFORMAT")},
- { DDERR_UNSUPPORTEDMASK ,TEXT("DDERR_UNSUPPORTEDMASK")},
- { DDERR_VERTICALBLANKINPROGRESS ,TEXT("DDERR_VERTICALBLANKINPROGRESS")},
- { DDERR_WASSTILLDRAWING ,TEXT("DDERR_WASSTILLDRAWING")},
- { DDERR_XALIGN ,TEXT("DDERR_XALIGN")},
- { DDERR_INVALIDDIRECTDRAWGUID ,TEXT("DDERR_INVALIDDIRECTDRAWGUID")},
- { DDERR_DIRECTDRAWALREADYCREATED ,TEXT("DDERR_DIRECTDRAWALREADYCREATED")},
- { DDERR_NODIRECTDRAWHW ,TEXT("DDERR_NODIRECTDRAWHW")},
- { DDERR_PRIMARYSURFACEALREADYEXISTS ,TEXT("DDERR_PRIMARYSURFACEALREADYEXISTS")},
- { DDERR_NOEMULATION ,TEXT("DDERR_NOEMULATION")},
- { DDERR_REGIONTOOSMALL ,TEXT("DDERR_REGIONTOOSMALL")},
- { DDERR_CLIPPERISUSINGHWND ,TEXT("DDERR_CLIPERISUSINGHWND")},
- { DDERR_NOCLIPPERATTACHED ,TEXT("DDERR_NOCLIPPERATTACHED")},
- { DDERR_NOHWND ,TEXT("DDERR_NOHWND")},
- { DDERR_HWNDSUBCLASSED ,TEXT("DDERR_HWNDSUBCLASSED")},
- { DDERR_HWNDALREADYSET ,TEXT("DDERR_HWNDALREADYSET")},
- { DDERR_NOPALETTEATTACHED ,TEXT("DDERR_NOPALETTEATTACHED")},
- { DDERR_NOPALETTEHW ,TEXT("DDERR_NOPALETTEHW")},
- { DDERR_BLTFASTCANTCLIP ,TEXT("DDERR_BLTFASTCANTCLIP")},
- { DDERR_NOBLTHW ,TEXT("DDERR_NOBLTHW")},
- { DDERR_NODDROPSHW ,TEXT("DDERR_NODDROPSHW")},
- { DDERR_OVERLAYNOTVISIBLE ,TEXT("DDERR_OVERLAYNOTVISIBLE")},
- { DDERR_NOOVERLAYDEST ,TEXT("DDERR_NOOVERLAYDEST")},
- { DDERR_INVALIDPOSITION ,TEXT("DDERR_INVALIDPOSITION")},
- { DDERR_NOTAOVERLAYSURFACE ,TEXT("DDERR_NOTAOVERLAYSURFACE")},
- { DDERR_EXCLUSIVEMODEALREADYSET ,TEXT("DDERR_EXCLUSIVEMODEALREADYSET")},
- { DDERR_NOTFLIPPABLE ,TEXT("DDERR_NOTFLIPPABLE")},
- { DDERR_CANTDUPLICATE ,TEXT("DDERR_CANTDUPLICATE")},
- { DDERR_NOTLOCKED ,TEXT("DDERR_NOTLOCKED")},
- { DDERR_CANTCREATEDC ,TEXT("DDERR_CANTCREATEDC")},
- { DDERR_NODC ,TEXT("DDERR_NODC")},
- { DDERR_WRONGMODE ,TEXT("DDERR_WRONGMODE")},
- { DDERR_IMPLICITLYCREATED ,TEXT("DDERR_IMPLICITLYCREATED")},
-};


-
HWND LBCreate( HWND hWnd, HINSTANCE hInst, DWORD pos, BOOL debug )
{
hWndListBox = CreateWindow(
@@ -198,28 +104,3 @@
}


-static LPTSTR getErrorString( HRESULT ddrval )
-{
- int i;
-
- for( i=0;i<sizeof( elErrors )/sizeof( elErrors[0] );i++ )
- {
- if( ddrval == elErrors[i].rval )
- {
- return elErrors[i].str;
- }
- }
-
- return TEXT("Unknown Error Code");
-}
-
-
-void __cdecl LBPrintfRC( HRESULT ddrval, LPTSTR fmt, ... )
-{
- TCHAR buff[512];
-
- wvsprintf( buff, fmt, (LPVOID)(&fmt+1) );
-
- LBPrintf( TEXT("%s, rc=%ld (0x%08lx:%s)"), buff, LOWORD( ddrval ),
- ddrval, getErrorString( ddrval ) );
-}
Index: resource.h
===================================================================
--- resource.h (revision 23142)
+++ resource.h (working copy)
@@ -70,16 +70,19 @@
#define IDC_COMBO_DRIVERS 1035
#define ID_FILE_RESTORE 40001
#define ID_FILE_EXIT 40002
-#define ID_VIEW_DRIVERCAPS 40003
-#define ID_VIEW_DRIVERCOLORKEYCAPS 40004
-#define ID_VIEW_DRIVERFXCAPS 40005
-#define ID_VIEW_DRIVERPALETTECAPS 40006
-#define ID_VIEW_DRIVERSURFACECAPS 40007
-#define ID_VIEW_HELCAPS 40008
+#define ID_VIEW_DRIVERCOLORKEYCAPS 40003
+#define ID_VIEW_DRIVERPALETTECAPS 40004
+#define ID_VIEW_DRIVERBLTCAPS 40005
+#define ID_VIEW_DRIVERALPHACAPS 40006
+#define ID_VIEW_DRIVEROVERLAYCAPS 40007
+#define ID_VIEW_DRIVERMISCCAPS 40008
#define ID_VIEW_HELCOLORKEYCAPS 40009
-#define ID_VIEW_HELFXCAPS 40010
-#define ID_VIEW_HELPALETTECAPS 40011
-#define ID_VIEW_HELSURFACECAPS 40012
+#define ID_VIEW_HELPALETTECAPS 40010
+#define ID_VIEW_HELBLTCAPS 40011
+#define ID_VIEW_HELALPHACAPS 40012
+#define ID_VIEW_HELOVERLAYCAPS 40013
+#define ID_VIEW_HELMISCCAPS 40014
+
#define IDC_STATIC -1

// Next default values for new objects


source 所在位置是 C:\WINCE600\PUBLIC\DIRECTX\SDK\SAMPLES\DXMISC\DDCAPS

build ddcaps 的 command 是:
sysgen -p directx ddcaps
因為 ddcaps 是在 public 下的 directx 目錄,所以 -p 後面要寫 directx ,意思是(path = directx)。
project name 就是 ddcaps.

DirectDraw Capability in CE 6.0

要知道系統哪些 DirectDraw Function 是 hardware support,哪些是用 software emulate,
可以用 IDirectDraw::GetCaps 來取得 ddraw capability 列表:
HRESULT GetCaps(
LPDDCAPS lpDDDriverCaps,
LPDDCAPS lpDDEmulCaps
);

傳進去的兩個 argument 都是用來取出 capability 的 structure pointer,結構完全一樣,一個是 hardware support list,一個是 software emulation list
  • lpDDDriverCaps : hardware
  • lpDDEmulCaps : software
Support List structure 的definition 是 DDCAPS

typedef struct _DDCAPS {
DWORD dwSize;
DWORD dwCKeyCaps;
DWORD dwPalCaps;
DWORD dwBltCaps;
DWORD dwAlphaCaps;
DWORD dwOverlayCaps;
DWORD dwVidMemTotal;
DWORD dwVidMemFree;
DWORD dwVidMemStride;
DWORD dwMaxVisibleOverlays;
DWORD dwCurrVisibleOverlays;
DWORD dwNumFourCCCodes;
DWORD dwAlignBoundarySrc;
DWORD dwAlignSizeSrc;
DWORD dwAlignBoundaryDest;
DWORD dwAlignSizeDest;
DWORD dwRops[DD_ROP_SPACE];
DWORD dwMinOverlayStretch;
DWORD dwMaxOverlayStretch;
DWORD dwMiscCaps;
} DDCAPS,FAR *LPDDCAPS;

每個 DWORD的每個 bit 都代表一個 function,宣告在 ddraw.h (C:\WINCE600\PUBLIC\COMMON\SDK\INC\ddraw.h)

platform builder public folder 附有一個 DDCAPS 的 sample program,可以列出 platform ddraw hardware/software support .
很悲慘的是,ddcaps structure 在 CE 6.0 大幅修改,所以DDCAPS sample code 在 6.0 不能 build 了!!
看這一篇: DirectDraw Migration.




我做了修改: Modify DDCAPS for CE 6.0

7.05.2010

再作 celog.dll - boot time

因為要作 msdn 那個 delay load driver 的測試,所以把 celog 也 enable 起來:

在 os project 勾選
  • enable event tracking during boot
  • flush tracked event to release directory
然後 修改 makexip.js,把 celog.dll 放到 boot region。


參考 http://msdn.microsoft.com/en-us/library/aa450700.aspx
設定

[HKEY_LOCAL_MACHINE\System\CeLog]
"Transport"="LocalFile"
"FileName"="\\celog.clg"
"ZoneCE"=dword:00014040
"FlushTimeout"=dword:1F4

log 到 ram, 每 500ms flush 到 ram file一次 (避免 data loss)
log 的東西:
  • CELZONE_BOOT_TIME 0x00010000 -- 包含 boot event
  • CELZONE_LOADER 0x00004000 -- 包含 load module (dll) 的 event
  • CELZONE_PROCESS 0x00000040 -- 包含 create process (exe) 的 event
重 build 開機後,就可以看到 celog.clg 在 // 下, copy 到 SD。
開啟 build environment:
 readlog celog.clg output.txt
把 clg 轉為文字。

就可以看到 load module 和 create process event 的時間了。

clone public code

大概就是用 sysgen_capture 這個 tool 來作:

首先找到 sysgen 的 targetname。假設是 celogflush 好了
* 在 platform/yourbspname 下 create 一個 folder : celogflush
* 在 celogflush 下: sysgen_capture -p common celogflush
* copy public/common/sdk/samples/celog/flush/celogflush/flush.c 過來
* 因為 celogflush/sources 有列 include path : ..,所以把 ../*.h 也 copy 過來
* rename 剛剛 sysgen_capture 產生的 sources.celogflush 為 sources
* 修改 sources,把 source = 加上 flush.c
* copy Makefile 過來
這樣就可以下 build,產生 celogflush.exe 了

主要大概是用 sysgen_caputre 產生 target 的 source 檔,這樣才知道 target 用的 library 有哪些。

把 source file copy 過來,修改 sources。
雖然 library 中會有同樣的 sample,但是大蓋會以 source = 列出的優先(吧?)

6.29.2010

The master makefile of Windows CE

真是太感謝 Kun-Yi 啦!

從我進來這裡,RBT 就展示他sysgen XXX 的能力,讓我門少build 一些 code,少浪費一些時間。
但是我問他,怎麼知道 改 OOO 時要用 XXX ?
他也說不出個所以然來
不然就是他不願意說...
所以我就不斷的在找這個謎.....(找了好幾年..)

後來,上一篇,偉大而又無私的 資深 Windows CE 專家 Kun-Ki 直接給出答案:
就是 PUBLIC\COMMON\CESYSGEN\makefile

打開來看,果然有所有 target 的 name 和 dependency..

真是令人感動!!

終於看到 CE 的 master makefile ....

6.28.2010

output message on device on/off - sysgen and private

在查 system poweron/off 時,有時要列印出所以 driver 的 on/off message。
一個一個加很麻煩,可以直接在 device manger 加:
C:\WinCE600\PRIVATE\WINCEOS\COREOS\DEVICE\DEVCORE\Devapi.c
裡面的 DevMgrPowerOffHandler:
原來的
                DEBUGMSG(ZONE_PNP,(TEXT("Calling \'%s\' PowerDown at 0x%x\r\n"),
改為強制輸出的 RETAILMSG 就可以。


在該 folder build 完後,下 sysgen -p common devmgr 後,就可以makeimg 了。



-p common 的意思是 "在 wince600\public\common 下"
-p option 好像是指 public 下的 folder。
所以 sysgen -p common devmgr 的意思是要 sysgen public\common\ 下的 devmgr
-- 雖然不知道怎麼看出common folder 里有 devmgr 這個 target @_@..

可以測試一下:
sysgen -p directx 會 build 出 public\direct 下所有的 directx example
如果只要 build mosquito:
sysgen -p directx mosquito



sysgen 也是一個 batch 檔...

只是我一直找不到那些 sysgen 的 "target" 到底在哪裡...

關於 sysgen 的target ..大概可以到 retail folder 去找,, dll 或是 exe。
用 cesysgen_capture,會產生 該 project 的 sources file,然後去找該 target 是由哪些
library build 出來的。
cesysgen_capture -p common devmgr 
會產生一個 sources.devmgr

sysgen_capture device

會產生一堆 (相依?) 的 source 檔:
  • sources.ceddk -- ceddk.lib
  • sources.devmgr -- devmgr.lib
  • sources.pm -- pm.lib
  • sources.udevice -- udevice.exe
  • sources.device -- device.exe

6.24.2010

smart_ptr in WTL CBitmap

看到 WTL 的 AtlCopyBitmap ( ) 中,有:
CBitmap bmNew = NULL;
..
bmNew.CreateCompatibleBitmap( ..
覺得很奇怪。
所以看一下 CBitmap 的 implement (在 atlgdi.h),, 有這一段:
CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
{
Attach(hBitmap);
return *this;
}

void Attach(HBITMAP hBitmap)
{
if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = hBitmap;
}

HBITMAP Detach()
{
HBITMAP hBitmap = m_hBitmap;
m_hBitmap = NULL;
return hBitmap;
}

所以是 CBitmap overwrite 了 operator "="
配合 attach, detach 來看,這有點像 smart_ptr 的作法。... 雖然他是handle wrapper,不是 pointer wrapper..

typedef CBitmapT CBitmap;
true 代表 memory management 由 class 自己 handle。


所以那個 CBitmap bmNew = NULL 代表將 bmNew 的 member m_hBitmap 設為 NULL。
這應該只是為了好看吧..否則寫兩行也可以呀:
CBitmap bmNew;
bmNew.m_hBitmap = NULL;

6.23.2010

GDI - SelectObject

DC (Device Context) 是畫布
一堆 GDI 物件:Pen, Brush, Font, Bitmap, ..都是可以畫在畫布(DC)上的物件。


所以要用這些 GDI 畫圖時,要用 SelectObject(DC_A,Object_A) ,告訴kernel 我要 DC_A上用Object_A 畫圖了。

SelectObject( ) 會傳回那個 DC 原來的 Object 內容,讓你畫完後,可以 Select 回來原來物件。
例如原來是 12 點字,後來用 14 點字寫幾個字後,選回原來的 12點字


... 希望這個想法可以用....

6.15.2010

Bookmark - Monte Carlo Profiler for CE 6.0 (MSDN)

http://msdn.microsoft.com/en-US/library/ee481579.aspx 這一篇 MSDN 有講 CE 6.0 Monte Carlo Profiler 的作法,可以試試看。

用 target control 下 prof 可以看到help

6.10.2010

Close button on Dialog Menu

原來 msdn 有寫

Dialog Create 時有加上 "WS_SYSMENU" flag 的話,dialog 上方就會出現 menu bar,然後有 minimize, maximum, close 三個方塊在右邊。

當按下 close 方塊時,windows 會送出 IDCANCEL 這個 command。

所以要加上 IDCANCEL 的 command id handler ,才會關掉 dialog。

5.28.2010

Win32 Listbox Control 的操作

有時候要簡單的 log 來 show message,但是又不是 console mode ,這樣就要拉一個 ListBox 來作。

ListBox 的操作: MSDN - Listbox

首先 Win32 的 Control 就是預先寫好的小Dialog Window,所以要控制 Control Item ,只有用 SendMessage 的方式。

這種已經寫好的 Control (DialogWindow),每次要送message 過去,還要先從 ID 取得 hWnd 再送,有點麻煩,所以 Win32 提供一個直接對 ID 送 Message 的 function
SendDlgItemMessage
ListBox 的控制,用在 show log 的化,簡單的就是:
  1. 加入Item
  2. 移動 List
  3. 刪除 Item
三個都是用 SendDlgItemMesage 來完成的,三個function 的 Message ID 不一樣:
  1. 加入 Item : LB_ADDSTRING
  2. 移動List : LB_SETTOPINDEX
  3. 刪除 Item : LB_DELETESTRING
另外,ListBox 有一個 property - Sort,可以設定是否自動對 Item 排序,在作 Log 用時當然是不需要,但是 default 是 TRUE,要記得改。

ADDSTRING default 是作 "Append",所以剛好符合 log 的動作,從後面加上去。

ListBox 雖然有 scroll bar ,但是不會自己scroll 到最後,所以要用 LB_SETTOPINDEX 來指定第一個顯示的 item,好移動 scrollbar。
但是因為要讓最後一行對齊最後,所以反而要先用 LB_GETCOUNT 取得所有 item 的數量,自己減去 list 一面的 item 數好找到最後一頁的第一個 item 的 index...


以下就是簡單的 sample code,只有兩個 button - add, clear(all) 和一個 14 行的 list。
list 只保持 30 個 item,每按一下 add,就會加一行。
#include "stdafx.h"
#include <windows.h>
#include "ListBoxTest.h"


BOOL CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static int i=0;
switch (uMsg)
{
case WM_INITDIALOG:

return TRUE;
case WM_CLOSE:
EndDialog(hWnd,0);
return TRUE;
case WM_COMMAND:
switch(wParam)
{
case IDC_ADD :{
TCHAR outmsg[10];
swprintf(outmsg,_T("%d"),i++);

SendDlgItemMessage(hWnd,IDC_LIST1,LB_ADDSTRING,0,LPARAM(outmsg));
int cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);
if(cnt>30)
SendDlgItemMessage(hWnd,IDC_LIST1,LB_DELETESTRING,0,0);
cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);
if(cnt>=14)
SendDlgItemMessage(hWnd,IDC_LIST1,LB_SETTOPINDEX,cnt-14,0);
return TRUE;
}
case IDC_CLEAR:{
int cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);
while(cnt-->0)
SendDlgItemMessage(hWnd,IDC_LIST1,LB_DELETESTRING,0,0);
return TRUE;
}
default:
return FALSE;
}
default:
return FALSE;
}
}


WTL 有包裝 ListBox,使用 WTL 的 example 是 http://realchecko.blogspot.com/2010/08/clistbox-listbox-control-in-wtl.html

4.27.2010

列出所有執行中的 process name - in CE

如果是在 Windows XP/NT/2000 etc 會用 enumprocessmodule 這類的 RAPI。
但是在 CE 裡面這些 function 好像不 support。

CodeGuru 這一篇文章有 example,藥用 CreateToolhelp32Snapshot( )。
OS 要有 Core OS Services 的 Debugging Tools 的 Toolhelp API

MSDN 這一篇有說明 (要 toolhelp.lib)

sample code 是:

#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>


#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
PROCESSENTRY32 pe32 = { 0 };

HANDLE hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcSnap == INVALID_HANDLE_VALUE)
return 0;


pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hProcSnap,&pe32))
{
do{
wprintf(L"PID:%9d NAME: %s\r\n", pe32.th32ProcessID, pe32.szExeFile);
}while(Process32Next(hProcSnap, &pe32));
}

CloseHandle(hProcSnap);

return 0;
}


輸出的結果是:

PID: 4194306 NAME: NK.EXE
PID: 30736390 NAME: udevice.exe
PID: 41418754 NAME: udevice.exe
PID: 62521346 NAME: udevice.exe
PID: 79429634 NAME: udevice.exe
PID: 92995586 NAME: servicesd.exe
PID: 82313222 NAME: explorer.exe
PID: 97910798 NAME: enumallprocessconsole.exe

4.13.2010

一團混亂的 Windows CE update and Rn

Windows CE 的 update 真是一團混亂,又有 update, 又有 R1,R2,R3

所謂 R? 不就是update 的總和嗎?
那不就有 年度 rollup ,為什麼還要有 R2, R3 ?

如果是分開的,那麼 裝 R3 update 還需要裝 其他 update 嗎?
如果要,安裝的順序是?

真是一團混亂呀!

4.08.2010

ERROR_SHARING_VIOLATION - 有點白說

關於 ERROR_SHARING_VIOLATIOn 這個 error.
MS 的解釋

就是說,Windows 是一個 multi-tasking 的 OS,所以有人跟你同時在 access 一個 file,而且又同時 write....(有點看圖說故事的感覺)

所以有這個error 是很正常的事。

MS提供一個 sample code:

#define MAXRETRIES 5
#define RETRYDELAY 250

HANDLE hFile = INVALID_HANDLE_VALUE
DWORD dwRetries = 0;
BOOL bSuccess = FALSE;
DWORD dwErr = 0;

do
{
hFile = CreateFile( szFile,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( INVALID_HANDLE_VALUE == hFile )
{
dwErr = GetLastError();

if ( ERROR_SHARING_VIOLATION == dwErr )
{
dwRetries += 1;
Sleep(RETRYDELAY);
continue;
}
else
{
// An error occurred.
break;
}
}

bSuccess = TRUE;
break;
} while ( dwRetries < MAXRETRIES );

if ( bSuccess )
{
// You succeeded in opening the file.
}
else
{
// Failure occurs. Do graceful error handling.

// Here, you must notify the user of the failure.

MessageBox( NULL,
"Tried to update data file but it was already in use",
"Update error...",
MB_OK | MB_ICONSTOP );

// You also want to put the software back in the state it was in
// on entrance of the current function, as if the user had never
// tried to do the update.

// This may also require deallocating any resources that were
// allocated because of this operation.
}


就是有這個 error 的時候,就 sleep 一下,等那個好心的程式write 結束,再 試一次。



Windows XP 還有話說,因為一堆不知名的程式在background 跑 (virus scan, source control.. speed hd.. etc)

但是 Windows CE 還有這樣的error 真是.. 見鬼了

4.02.2010

more on celog - ref


CELZONE_ALWAYSON 0x40000000
CELZONE_BOOT_TIME 0x00010000
CELZONE_CRITSECT 0x00000100
CELZONE_DEBUG 0x00800000
CELZONE_HEAP 0x00000800
CELZONE_INTERRUPT 0x00000001
CELZONE_LOADER 0x00004000
CELZONE_SYNCH 0x00000200
===============================
0x40814901

CE 6.0 Preparation KIT 說:
NOTE Improving reference naming matching
The CeLog event-tracking system can take advantage of the kernel profiler to look up thread
function names based on start addresses when capturing CreateThread events, if you explicitly
enable the kernel profiler and add profiling symbols to the run-time image by rebuilding the
image with the IMGPROFILER environment variable set. However, CeLog can only look up the
profiling symbols built into the run-time image. Symbols of applications developed based on a
Software Development Kit (SDK) are generally unavailable to the CeLog event-tracking system.

也就是說勾選 PROFILING 就可用 fixthreads 列出 thread function name.

這一篇 http://blogs.msdn.com/ce_base/archive/2006/06/14/Thread-names-and-CeLog.aspx
也說使用 PROFILE 可以列出 thread name,
但是又說有 MAP 的話,可以用 -fixthread 或 -v 加入 thread name information

kernel tracker 的應用: 這一篇 Lock Convoys and How to Recognize Them 說明用 celog file 和 kernel tracker 找出 Lock Convoys 的狀況

用 readlog 作轉換。

celog : another way - by hand

在 news groupe 還有一篇說明: http://www.relatedterms.com/thread/1874715/If%20celog.clg%20is%20opened%20in%20kernel%20tracker%20%20the%20error%20-%20Corrupt%20datain%20log%20file%20-%20occurs.

Werner 回答說:

First, when you use IMGCELOGENABLE CeLog.dll is loaded very early in the
boot process, too early to read any registry info (as registry is not ready
yet at that time).
Second I see that you have set FlushTimeout=03e8. If you tell CeLogFlush to
use a timeout of 03e8 (1sec) it might be too fast.

What I do: Do not tick IMGCELOGENABLE, IMGOSCAPTURE, IMGAUTOFLUSH but add
celog.dll, oscapture.exe and celogflush.exe manually in your project.bib
(copy what you need to to from common.bib and common.reg). Make sure you add
the items in FILES section, not MODULES. Now CeLog.dll will only be loaded
when you run CelogFlsuh.exe or OSCapture.exe.As this is much later in the
boot process (I expect that the UI is up and running by then), CeLog.dll can
access the regsitry and load your registry settings. This way you can
increase the buffer size and leave the Flush Timeout to 10sec.

Are you using Celog in a DEBUG or RETAIL build? I have problems using CeLog
in DEBUG (together with VS + PlatformBuilder 6.0). After Celog.dll loads, it
crashes my image. In a RELEASE build everything works as expected.

Werner

3.25.2010

Celog : log on local files

Enable Celog 並且log 到 localfile

在 project option enable celog 和 celogflush 後,
設定部份要參考
http://msdn.microsoft.com/en-US/library/ee481192%28v=WinEmbedded.60%29.aspx

很好心的列出 log 在 SDCard 的方法..

但是我照著作卻不會成功,有一篇在 newsgroupe 的說明好像是說 在 system/init 啟動的 celogflush 太早,常常不能正確的 access registry setting,所以會不正確...

還有如果log到 localfile,又是 physical storage(不是ram)的話,要注意,當 celogflush 啟動的時候,一堆 storage都還沒mount 起來.......(唉~~)




另外一個,手動啟動的方法,不用 rebuild OS (所以 boot message log 不到)
http://msdn.microsoft.com/en-us/library/ms905191.aspx
  • Copy CeLog.dll and CeLogFlush.exe 到 \Windows 目錄
  • 在 SD 上 creatr 一個 "flush.lnk",內容是
    83#\Windows\celogflush.exe -buf 0x100000 -time 60000 -n \celog.clg -z 0x00800000 -ui 1
    對應的reg 設定是:

    [HKEY_LOCAL_MACHINE\System\CeLog]
    "Transport"="LocalFile"
    "FileName"="\\celog.clg"
    "ZoneCE"=dword:"00800000"
    "BufferSize"=dword:"100000"
    "UseUI"=dword:1
    這一個在system boots 時不能設1,因為GWES還沒起來。
  • 插入SD card,double click flush.lnk
會有一個 dialog 顯示log 到 \celog.clg

看 celog.clg 內容的方法:
  • 到 \ 去看(因為剛剛指定 \celog.clg),可以找到 celog.clg,copy 到 SD card
  • 開啟 VS2005 - platformbuilder -- open reslease directory
  • 在 dos prompt 下command
  • readlog celog.clf output.txt
..

所以為了避免麻煩,把celog.dll, celogflush.exe 放進 kernel image 好了..
如果是XIP的話,要放在 boot 的 bin part
也就是要改 makexip.js

CeFindFirstRegChange : monitor registry changes for you

這一篇文章(http://ce4all.blogspot.com/2010/03/registry-notifications-to-pass-data.html) 提到。
原來,可以利用CeFindFirstRegChange( ) 來幫忙 monitor registry 的變更。
然後用 WaitForSingleObject( ) 就可以了。
免去一直 pollig registry 的麻煩。

在 MSDN 也有說明這個: State and Notification Broker

偉大的 Bruce Eitman 有一系列文章講這個: http://geekswithblogs.net/BruceEitman/archive/2009/08/25/windows-ce-cereggetnotificationinfo-works-sort-of-part-3.aspx

... 嗯,沒錯,這篇只是一篇書籤而已 XD

維持Dialog 在最上面

要讓一個dialog 一直維持在最上層,不被其他AP蓋掉。
可以在 timer 的 handler 加上:

RECT rect;
GetWindowRect(hWnd,&rect);
SetWindowPos(hWnd,HWND_TOPMOST,
rect.left,rect.top,
rect.right-rect.left,rect.bottom-rect.top,
SWP_SHOWWINDOW);

定期的把自己 (hWnd) 設為 TOPMOST

3.24.2010

CE 6.0 的不同

這一篇 (http://msdn.microsoft.com/en-us/library/bb331824.aspx) 說的.

下面這些 IPC, CE 6.0 還是支援:
  • RAM-backed memory-mapped files,
  • point-to-point message queues,
  • WM_COPYDATA message.

下面這些利用 CE Memory "Slot" 特性的 API 就沒辦法支援了:
  • MapCallerToProcess and
  • SetProcPermissions APIs
其中
SetProcPermissions 可以用e ReadProcessMemory and WriteProcessMemory 來代替

Process 之間也不能用直接傳遞 Handle 的方式來共用了,傳遞之前要用
DuplicateHandle 來 clone handle 後再傳給其他 process