- implement enumerating DirectPlay service providers

- update resources

svn path=/trunk/; revision=33140
This commit is contained in:
Johannes Anderwald 2008-04-25 10:56:18 +00:00
parent 37f8eef287
commit baf72dcc52
8 changed files with 381 additions and 3 deletions

View file

@ -14,6 +14,8 @@
<library>version</library>
<library>dinput8</library>
<library>dxguid</library>
<library>dsound</library>
<library>version</library>
<file>system.c</file>
<file>display.c</file>
<file>sound.c</file>

View file

@ -81,6 +81,8 @@ IDD_NETWORK_DIALOG DIALOGEX DISCARDABLE 0, 0, 362, 190
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Registered DirectPlay Service Provider", -1, 10, 10, 352, 80
CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 20, 332, 60
END
IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 362, 190
@ -115,4 +117,18 @@ BEGIN
IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Driver"
IDS_NOT_APPLICABLE "Not applicable"
IDS_OPTION_YES "Yes"
IDS_DIRECTPLAY_COL_NAME1 "Name"
IDS_DIRECTPLAY_COL_NAME2 "Registry"
IDS_DIRECTPLAY_COL_NAME3 "File"
IDS_DIRECTPLAY_COL_NAME4 "Version"
IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider"
IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider"
IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider"
IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider"
IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP Connection For DirectPlay"
IDS_DIRECTPLAY_IPXCONN "IPX Connection For DirectPlay"
IDS_DIRECTPLAY_MODEMCONN "Modem Connection For DirectPlay"
IDS_DIRECTPLAY_SERIALCONN "Serial Connection For DirectPlay"
IDS_REG_SUCCESS "OK"
IDS_REG_FAIL "Error"
END

View file

@ -81,6 +81,8 @@ IDD_NETWORK_DIALOG DIALOGEX DISCARDABLE 0, 0, 362, 190
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Registered DirectPlay Service Provider", -1, 10, 10, 352, 80
CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 20, 332, 60
END
IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 362, 190
@ -115,4 +117,18 @@ BEGIN
IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Driver"
IDS_NOT_APPLICABLE "Not applicable"
IDS_OPTION_YES "Yes"
IDS_DIRECTPLAY_COL_NAME1 "Name"
IDS_DIRECTPLAY_COL_NAME2 "Registry"
IDS_DIRECTPLAY_COL_NAME3 "File"
IDS_DIRECTPLAY_COL_NAME4 "Version"
IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider"
IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider"
IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider"
IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider"
IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP Connection For DirectPlay"
IDS_DIRECTPLAY_IPXCONN "IPX Connection For DirectPlay"
IDS_DIRECTPLAY_MODEMCONN "Modem Connection For DirectPlay"
IDS_DIRECTPLAY_SERIALCONN "Serial Connection For DirectPlay"
IDS_REG_SUCCESS "OK"
IDS_REG_FAIL "Error"
END

View file

@ -94,6 +94,8 @@ IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 362, 190
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Registered DirectPlay Service Provider", -1, 10, 10, 352, 80
CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 20, 332, 60
END
STRINGTABLE DISCARDABLE
@ -122,5 +124,18 @@ BEGIN
IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Driver"
IDS_NOT_APPLICABLE "Not applicable"
IDS_OPTION_YES "Yes"
IDS_DIRECTPLAY_COL_NAME1 "Name"
IDS_DIRECTPLAY_COL_NAME2 "Registry"
IDS_DIRECTPLAY_COL_NAME3 "File"
IDS_DIRECTPLAY_COL_NAME4 "Version"
IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider"
IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider"
IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider"
IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider"
IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP Connection For DirectPlay"
IDS_DIRECTPLAY_IPXCONN "IPX Connection For DirectPlay"
IDS_DIRECTPLAY_MODEMCONN "Modem Connection For DirectPlay"
IDS_DIRECTPLAY_SERIALCONN "Serial Connection For DirectPlay"
IDS_REG_SUCCESS "OK"
IDS_REG_FAIL "Error"
END

View file

@ -87,6 +87,8 @@ IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 362, 190
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Registered DirectPlay Service Provider", -1, 10, 10, 352, 80
CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 20, 332, 60
END
STRINGTABLE DISCARDABLE
@ -115,5 +117,18 @@ BEGIN
IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Driver"
IDS_NOT_APPLICABLE "Í/Ä"
IDS_OPTION_YES "Äà"
IDS_DIRECTPLAY_COL_NAME1 "Name"
IDS_DIRECTPLAY_COL_NAME2 "Registry"
IDS_DIRECTPLAY_COL_NAME3 "File"
IDS_DIRECTPLAY_COL_NAME4 "Version"
IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider"
IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider"
IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider"
IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider"
IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP Connection For DirectPlay"
IDS_DIRECTPLAY_IPXCONN "IPX Connection For DirectPlay"
IDS_DIRECTPLAY_MODEMCONN "Modem Connection For DirectPlay"
IDS_DIRECTPLAY_SERIALCONN "Serial Connection For DirectPlay"
IDS_REG_SUCCESS "OK"
IDS_REG_FAIL "Error"
END

View file

@ -9,6 +9,298 @@
#include "precomp.h"
typedef struct
{
WCHAR Guid[40];
UINT ResourceID;
}DIRECTPLAY_GUID;
typedef struct _LANGANDCODEPAGE_
{
WORD lang;
WORD code;
} LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
static DIRECTPLAY_GUID DirectPlay8SP[] =
{
{
L"{6D4A3650-628D-11D2-AE0F-006097B01411}",
IDS_DIRECTPLAY8_MODEMSP
},
{
L"{743B5D60-628D-11D2-AE0F-006097B01411}",
IDS_DIRECTPLAY8_SERIALSP
},
{
L"{53934290-628D-11D2-AE0F-006097B01411}",
IDS_DIRECTPLAY8_IPXSP
},
{
L"{EBFE7BA0-628D-11D2-AE0F-006097B01411}",
IDS_DIRECTPLAY8_TCPSP
}
};
static DIRECTPLAY_GUID DirectPlaySP[] =
{
{
L"{36E95EE0-8577-11cf-960C-0080C7534E82}",
IDS_DIRECTPLAY_TCPCONN
},
{
L"685BC400-9D2C-11cf-A9CD-00AA006886E3",
IDS_DIRECTPLAY_IPXCONN
},
{
L"{44EAA760-CB68-11cf-9C4E-00A0C905425E}",
IDS_DIRECTPLAY_MODEMCONN
},
{
L"{0F1D6860-88D9-11cf-9C4E-00A0C905425E}",
IDS_DIRECTPLAY_SERIALCONN
}
};
static
VOID
InitListViewColumns(HWND hDlgCtrl)
{
WCHAR szText[256];
LVCOLUMNW lvcolumn;
INT Index;
ZeroMemory(&lvcolumn, sizeof(LVCOLUMNW));
lvcolumn.pszText = szText;
lvcolumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.cx = 200;
for(Index = 0; Index < 4; Index++)
{
szText[0] = L'\0';
LoadStringW(hInst, IDS_DIRECTPLAY_COL_NAME1 + Index, szText, sizeof(szText) / sizeof(WCHAR));
szText[(sizeof(szText) / sizeof(WCHAR))-1] = L'\0';
if (Index)
lvcolumn.cx = 98;
if (SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, Index, (LPARAM)&lvcolumn) == -1)
return;
}
}
UINT
FindProviderIndex(LPCWSTR szGuid, DIRECTPLAY_GUID * PreDefProviders)
{
UINT Index;
for(Index = 0; Index < 4; Index++)
{
if (!wcsncmp(PreDefProviders[Index].Guid, szGuid, 40))
return Index;
}
return UINT_MAX;
}
static
BOOL
GetFileVersion(WCHAR * szAppName, WCHAR * szVer)
{
UINT VerSize;
DWORD DummyHandle;
LPVOID pBuf;
WORD lang = 0;
WORD code = 0;
LPLANGANDCODEPAGE lplangcode;
WCHAR szBuffer[100];
WCHAR * pResult;
BOOL bResult = FALSE;
static const WCHAR wFormat[] = L"\\StringFileInfo\\%04x%04x\\FileVersion";
static const WCHAR wTranslation[] = L"VarFileInfo\\Translation";
/* query version info size */
VerSize = GetFileVersionInfoSizeW(szAppName, &DummyHandle);
if (!VerSize)
return FALSE;
/* allocate buffer */
pBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, VerSize);
if (!pBuf)
return FALSE;
/* query version info */
if(!GetFileVersionInfoW(szAppName, 0, VerSize, pBuf))
{
HeapFree(GetProcessHeap(), 0, pBuf);
return FALSE;
}
/* query lang code */
if(VerQueryValueW(pBuf, wTranslation, (LPVOID *)&lplangcode, &VerSize))
{
/* FIXME find language from current locale / if not available,
* default to english
* for now default to first available language
*/
lang = lplangcode->lang;
code = lplangcode->code;
}
/* set up format */
swprintf(szBuffer, wFormat, lang, code);
/* query manufacturer */
pResult = NULL;
bResult = VerQueryValueW(pBuf, szBuffer, (LPVOID *)&pResult, &VerSize);
if (VerSize && bResult && pResult)
{
wcscpy(szVer, pResult);
bResult = TRUE;
}
HeapFree(GetProcessHeap(), 0, pBuf);
return bResult;
}
static
BOOL
EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProviders)
{
DWORD dwIndex = 0;
LONG result;
WCHAR szName[50];
WCHAR szGUID[40];
WCHAR szTemp[63];
WCHAR szResult[MAX_PATH+20] = {0};
DWORD RegProviders = 0;
DWORD ProviderIndex;
DWORD dwName;
LVITEMW Item;
INT ItemCount;
LRESULT lResult;
ItemCount = ListView_GetItemCount(hDlgCtrl);
ZeroMemory(&Item, sizeof(LVITEMW));
Item.mask = LVIF_TEXT;
Item.pszText = szResult;
Item.iItem = ItemCount;
/* insert all predefined items first */
for(dwIndex = 0; dwIndex < 4; dwIndex++)
{
Item.iItem = ItemCount + dwIndex;
Item.iSubItem = 0;
szResult[0] = L'\0';
LoadStringW(hInst, PreDefProviders[dwIndex].ResourceID, szResult, sizeof(szResult)/sizeof(WCHAR));
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
lResult = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item);
szResult[0] = L'\0';
LoadStringW(hInst, IDS_REG_FAIL, szResult, sizeof(szResult)/sizeof(WCHAR));
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
Item.iItem = lResult;
Item.iSubItem = 1;
lResult = SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
}
dwIndex = 0;
do
{
dwName = sizeof(szName) / sizeof(WCHAR);
result = RegEnumKeyEx(hKey, dwIndex, szName, &dwName, NULL, NULL, NULL, NULL);
if (result == ERROR_SUCCESS)
{
szName[(sizeof(szName)/sizeof(WCHAR))-1] = L'\0';
ProviderIndex = UINT_MAX;
if (GetRegValue(hKey, szName, L"GUID", REG_SZ, szGUID, sizeof(szGUID)))
ProviderIndex = FindProviderIndex(szGUID, PreDefProviders);
else
ProviderIndex = UINT_MAX;
szResult[0] = L'\0';
/* check if the 'Path' key is available */
if (!GetRegValue(hKey, szName, L"Path", REG_SZ, szResult, sizeof(szResult)))
{
/* retrieve the path by lookup the CLSID */
wcscpy(szTemp, L"CLSID\\");
wcscpy(&szTemp[6], szGUID);
wcscpy(&szTemp[44], L"\\InProcServer32");
if (!GetRegValue(HKEY_CLASSES_ROOT, szTemp, NULL, REG_SZ, szResult, sizeof(szResult)))
szResult[0] = L'\0';
}
if (szResult[0])
{
/* insert path name */
Item.iSubItem = 2;
Item.iItem = ProviderIndex + ItemCount;
SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
/* retrieve file version */
if (!GetFileVersion(szResult, szTemp))
{
szTemp[0] = L'\0';
LoadStringW(hInst, IDS_VERSION_UNKNOWN, szTemp, sizeof(szTemp)/sizeof(WCHAR));
szTemp[(sizeof(szTemp)/sizeof(WCHAR))-1] = L'\0';
}
Item.iSubItem = 3;
Item.pszText = szTemp;
SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
Item.pszText = szResult;
}
if (ProviderIndex != UINT_MAX)
{
RegProviders |= (1 << ProviderIndex);
szResult[0] = L'\0';
LoadStringW(hInst, IDS_REG_SUCCESS, szResult, sizeof(szResult));
Item.iSubItem = 1;
Item.iItem = ProviderIndex + ItemCount;
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
}
}
dwIndex++;
}while(result != ERROR_NO_MORE_ITEMS);
/* check if all providers have been registered */
// if (RegProviders == 15)
return TRUE;
return FALSE;
}
static
void
InitializeDirectPlayDialog(HWND hwndDlg)
{
HKEY hKey;
LONG result;
HWND hDlgCtrl;
/* open DirectPlay8 key */
result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\DirectPlay8\\Service Providers", 0, KEY_READ, &hKey);
if (result != ERROR_SUCCESS)
return;
hDlgCtrl = GetDlgItem(hwndDlg, IDC_LIST_PROVIDER);
/* initialize list ctrl */
InitListViewColumns(hDlgCtrl);
/* enumerate providers */
result = EnumerateServiceProviders(hKey, hDlgCtrl, DirectPlay8SP);
RegCloseKey(hKey);
if (!result)
return;
/* open DirectPlay key */
result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\DirectPlay\\Service Providers", 0, KEY_READ, &hKey);
if (result != ERROR_SUCCESS)
return;
/* enumerate providers */
result = EnumerateServiceProviders(hKey, hDlgCtrl, DirectPlaySP);
RegCloseKey(hKey);
}
INT_PTR CALLBACK
NetworkPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
@ -18,6 +310,7 @@ NetworkPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
case WM_INITDIALOG:
{
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
InitializeDirectPlayDialog(hDlg);
return TRUE;
}
}

View file

@ -2,14 +2,16 @@
#define PRECOMP_H__
#define DIRECTINPUT_VERSION 0x0800
#define DIRECTSOUND_VERSION 0x0800
#include <stdio.h>
#include <windows.h>
#include <limits.h>
#include <setupapi.h>
#include <devguid.h>
#include <commctrl.h>
#include <dinput.h>
#include <dsound.h>
#include "resource.h"
typedef struct

View file

@ -40,6 +40,11 @@
#define IDC_TREE_PORT 6001
#define IDC_RICH_INFO 6002
/* DirectPlay dialog constants */
#define IDC_LIST_PROVIDER 7000
/* string resource constants */
#define IDS_MAIN_DIALOG 10000
#define IDS_SYSTEM_DIALOG 10001
@ -65,6 +70,20 @@
#define IDS_DEVICE_FORCEFEEDBACK 10021
#define IDS_NOT_APPLICABLE 10100
#define IDS_OPTION_YES 10101
#define IDS_DIRECTPLAY_COL_NAME1 10102
#define IDS_DIRECTPLAY_COL_NAME2 10103
#define IDS_DIRECTPLAY_COL_NAME3 10104
#define IDS_DIRECTPLAY_COL_NAME4 10105
#define IDS_DIRECTPLAY8_MODEMSP 10106
#define IDS_DIRECTPLAY8_SERIALSP 10107
#define IDS_DIRECTPLAY8_IPXSP 10108
#define IDS_DIRECTPLAY8_TCPSP 10109
#define IDS_DIRECTPLAY_TCPCONN 10110
#define IDS_DIRECTPLAY_IPXCONN 10111
#define IDS_DIRECTPLAY_MODEMCONN 10112
#define IDS_DIRECTPLAY_SERIALCONN 10113
#define IDS_REG_FAIL 10114
#define IDS_REG_SUCCESS 10115
/* icon resource constants */
#define IDI_APPICON 20000