From: Johannes Anderwald Date: Fri, 18 Dec 2009 10:42:29 +0000 (+0000) Subject: [WDMAUD.DRV] X-Git-Tag: backups/aicom-network-stable@46924~260 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=af23bde5812aa76e7ec9fefd83ddcae59d71498d;ds=sidebyside [WDMAUD.DRV] - Add support for Opening/Querying/Closing registry keys within the mmixer library svn path=/trunk/; revision=44647 --- diff --git a/reactos/dll/win32/wdmaud.drv/mmixer.c b/reactos/dll/win32/wdmaud.drv/mmixer.c index 3f5fa1b1e6a..991454e5572 100644 --- a/reactos/dll/win32/wdmaud.drv/mmixer.c +++ b/reactos/dll/win32/wdmaud.drv/mmixer.c @@ -16,7 +16,10 @@ VOID Free(PVOID Block); VOID Copy(PVOID Src, PVOID Dst, ULONG NumBytes); MIXER_STATUS Open(IN LPWSTR DevicePath, OUT PHANDLE hDevice); MIXER_STATUS Control(IN HANDLE hMixer, IN ULONG dwIoControlCode, IN PVOID lpInBuffer, IN ULONG nInBufferSize, OUT PVOID lpOutBuffer, ULONG nOutBufferSize, PULONG lpBytesReturned); -MIXER_STATUS Enum(IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR * DeviceName, OUT PHANDLE OutHandle); +MIXER_STATUS Enum(IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR * DeviceName, OUT PHANDLE OutHandle, OUT PHANDLE OutKey); +MIXER_STATUS OpenKey(IN HANDLE hKey, IN LPWSTR SubKey, IN ULONG DesiredAccess, OUT PHANDLE OutKey); +MIXER_STATUS CloseKey(IN HANDLE hKey); +MIXER_STATUS QueryKeyValue(IN HANDLE hKey, IN LPWSTR KeyName, OUT PVOID * ResultBuffer, OUT PULONG ResultLength, OUT PULONG KeyType); MIXER_CONTEXT MixerContext = { @@ -27,11 +30,59 @@ MIXER_CONTEXT MixerContext = Free, Open, Close, - Copy + Copy, + OpenKey, + QueryKeyValue, + CloseKey }; GUID CategoryGuid = {STATIC_KSCATEGORY_AUDIO}; +MIXER_STATUS +QueryKeyValue( + IN HANDLE hKey, + IN LPWSTR KeyName, + OUT PVOID * ResultBuffer, + OUT PULONG ResultLength, + OUT PULONG KeyType) +{ + if (RegQueryValueExW((HKEY)hKey, KeyName, NULL, KeyType, NULL, ResultLength) == ERROR_FILE_NOT_FOUND) + return MM_STATUS_UNSUCCESSFUL; + + *ResultBuffer = HeapAlloc(GetProcessHeap(), 0, *ResultLength); + if (*ResultBuffer == NULL) + return MM_STATUS_NO_MEMORY; + + if (RegQueryValueExW((HKEY)hKey, KeyName, NULL, KeyType, *ResultBuffer, ResultLength) != ERROR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, *ResultBuffer); + return MM_STATUS_UNSUCCESSFUL; + } + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +OpenKey( + IN HANDLE hKey, + IN LPWSTR SubKey, + IN ULONG DesiredAccess, + OUT PHANDLE OutKey) +{ + if (RegOpenKeyExW((HKEY)hKey, SubKey, 0, DesiredAccess, (PHKEY)OutKey) == ERROR_SUCCESS) + return MM_STATUS_SUCCESS; + + return MM_STATUS_UNSUCCESSFUL; +} + +MIXER_STATUS +CloseKey( + IN HANDLE hKey) +{ + RegCloseKey((HKEY)hKey); + return MM_STATUS_SUCCESS; +} + + PVOID Alloc(ULONG NumBytes) { return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, NumBytes); @@ -151,13 +202,15 @@ Enum( IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR * DeviceName, - OUT PHANDLE OutHandle) + OUT PHANDLE OutHandle, + OUT PHANDLE OutKey) { SP_DEVICE_INTERFACE_DATA InterfaceData; SP_DEVINFO_DATA DeviceData; PSP_DEVICE_INTERFACE_DETAIL_DATA_W DetailData; BOOL Result; DWORD Length; + MIXER_STATUS Status; //printf("Enum EnumContext %p DeviceIndex %lu OutHandle %p\n", EnumContext, DeviceIndex, OutHandle); @@ -196,12 +249,40 @@ Enum( if (!Result) { + DPRINT("SetupDiGetDeviceInterfaceDetailW failed with %lu\n", GetLastError()); return MM_STATUS_UNSUCCESSFUL; } - // copy path - *DeviceName = (LPWSTR)&DetailData->DevicePath[0]; - return Open(DetailData->DevicePath, OutHandle); + + *OutKey = SetupDiOpenDeviceInterfaceRegKey(EnumContext, &InterfaceData, 0, KEY_READ); + if ((HKEY)*OutKey == INVALID_HANDLE_VALUE) + { + HeapFree(GetProcessHeap(), 0, DetailData); + return MM_STATUS_UNSUCCESSFUL; + } + + Status = Open(DetailData->DevicePath, OutHandle); + + if (Status != MM_STATUS_SUCCESS) + { + RegCloseKey((HKEY)*OutKey); + HeapFree(GetProcessHeap(), 0, DetailData); + return Status; + } + + *DeviceName = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (wcslen(DetailData->DevicePath)+1) * sizeof(WCHAR)); + if (*DeviceName == NULL) + { + CloseHandle(*OutHandle); + RegCloseKey((HKEY)*OutKey); + HeapFree(GetProcessHeap(), 0, DetailData); + return MM_STATUS_NO_MEMORY; + } + + wcscpy(*DeviceName, DetailData->DevicePath); + HeapFree(GetProcessHeap(), 0, DetailData); + + return Status; } BOOL