00001
00002
00003
00004
00005
00006 #include <streams.h>
00007 #include <ddraw.h>
00008 #include "ddmm.h"
00009
00010 typedef struct {
00011 LPSTR szDevice;
00012 GUID* lpGUID;
00013 GUID GUID;
00014 BOOL fFound;
00015 } FindDeviceData;
00016
00017 BOOL CALLBACK FindDeviceCallback(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam)
00018 {
00019 FindDeviceData *p = (FindDeviceData*)lParam;
00020
00021 if (lstrcmpiA(p->szDevice, szDevice) == 0) {
00022 if (lpGUID) {
00023 p->GUID = *lpGUID;
00024 p->lpGUID = &p->GUID;
00025 } else {
00026 p->lpGUID = NULL;
00027 }
00028 p->fFound = TRUE;
00029 return FALSE;
00030 }
00031 return TRUE;
00032 }
00033
00034 BOOL CALLBACK FindDeviceCallbackEx(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam, HMONITOR hMonitor)
00035 {
00036 FindDeviceData *p = (FindDeviceData*)lParam;
00037
00038 if (lstrcmpiA(p->szDevice, szDevice) == 0) {
00039 if (lpGUID) {
00040 p->GUID = *lpGUID;
00041 p->lpGUID = &p->GUID;
00042 } else {
00043 p->lpGUID = NULL;
00044 }
00045 p->fFound = TRUE;
00046 return FALSE;
00047 }
00048 return TRUE;
00049 }
00050
00051 IDirectDraw * DirectDrawCreateFromDevice(LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP)
00052 {
00053 IDirectDraw* pdd = NULL;
00054 FindDeviceData find;
00055
00056 if (szDevice == NULL) {
00057 DirectDrawCreateP(NULL, &pdd, NULL);
00058 return pdd;
00059 }
00060
00061 find.szDevice = szDevice;
00062 find.fFound = FALSE;
00063 DirectDrawEnumerateP(FindDeviceCallback, (LPVOID)&find);
00064
00065 if (find.fFound)
00066 {
00067
00068 UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
00069 DirectDrawCreateP(find.lpGUID, &pdd, NULL);
00070 SetErrorMode(ErrorMode);
00071 }
00072
00073 return pdd;
00074 }
00075
00076 IDirectDraw * DirectDrawCreateFromDeviceEx(LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP)
00077 {
00078 IDirectDraw* pdd = NULL;
00079 FindDeviceData find;
00080
00081 if (szDevice == NULL) {
00082 DirectDrawCreateP(NULL, &pdd, NULL);
00083 return pdd;
00084 }
00085
00086 find.szDevice = szDevice;
00087 find.fFound = FALSE;
00088 DirectDrawEnumerateExP(FindDeviceCallbackEx, (LPVOID)&find,
00089 DDENUM_ATTACHEDSECONDARYDEVICES);
00090
00091 if (find.fFound)
00092 {
00093
00094 UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
00095 DirectDrawCreateP(find.lpGUID, &pdd, NULL);
00096 SetErrorMode(ErrorMode);
00097 }
00098
00099 return pdd;
00100 }