[WDMAUD.DRV]
[reactos.git] / reactos / dll / win32 / wdmaud.drv / mmixer.c
index 3f5fa1b..991454e 100644 (file)
@@ -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