// // Server unregistration // HRESULT _stdcall DllUnregisterServer() { LONG rc; char errstr[128]; rc = UnregisterAsioDriver (IID_ASIO_DRIVER,"ASIOSample.dll","ASIO Sample Driver"); if (rc) { memset(errstr,0,128); sprintf(errstr,"Unregister Server failed ! (%d)",rc); MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"ASIO Korg1212 I/O Driver",MB_OK); return -1; } return S_OK; }
// // Server unregistration // HRESULT _declspec(dllexport) DllUnregisterServer() { LONG rc; char errstr[128]; rc = UnregisterAsioDriver (IID_ASIO_DRIVER[0],"kxasio.dll","kX ASIO Driver"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[1],"kxasio.dll","kX ASIO Driver 1"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[2],"kxasio.dll","kX ASIO Driver 2"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[3],"kxasio.dll","kX ASIO Driver 3"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[4],"kxasio.dll","kX ASIO Driver 4"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[5],"kxasio.dll","kX ASIO Driver 5"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[6],"kxasio.dll","kX ASIO Driver 6"); rc = UnregisterAsioDriver (IID_ASIO_DRIVER[7],"kxasio.dll","kX ASIO Driver 7"); if (rc) { debug("kxasio: unregister failed\n"); sprintf(errstr,"Unregister Server failed ! (%d)",rc); MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"kX ASIO Driver",MB_OK|MB_ICONSTOP); return -1; } return S_OK; }
/***************************************************************************** * UnregisterServer() ***************************************************************************** */ HRESULT UnregisterServer ( IN LPTSTR TargetSymbolicLink ) { _DbgPrintF(DEBUGLVL_VERBOSE,("[UnregisterServer]")); HRESULT hr = S_OK; HKEY AsioPublicKey = NULL; DWORD w32Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ASIO_PUBLIC_KEY, 0, KEY_ALL_ACCESS, &AsioPublicKey); if (ERROR_SUCCESS == w32Error) { ULONG NumberOfSubKeys = 0; w32Error = RegQueryInfoKey(AsioPublicKey, NULL, NULL, NULL, &NumberOfSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if ((ERROR_SUCCESS == w32Error) && NumberOfSubKeys) { PASIO_DRIVER_INFORMATION DriverInfo = PASIO_DRIVER_INFORMATION(LocalAlloc(LPTR, NumberOfSubKeys * sizeof(ASIO_DRIVER_INFORMATION))); if (DriverInfo) { ZeroMemory(DriverInfo, NumberOfSubKeys * sizeof(ASIO_DRIVER_INFORMATION)); for (ULONG i=0; i<NumberOfSubKeys; i++) { ULONG FriendlyNameLength = MAX_PATH; FILETIME LastWriteTime; w32Error = RegEnumKeyEx(AsioPublicKey, i, DriverInfo[i].FriendlyName, &FriendlyNameLength, NULL, NULL, NULL, &LastWriteTime); } for (ULONG i=0; i<NumberOfSubKeys; i++) { BOOL FoundAsioDriverKey = FALSE; // Open the key up to check if our driver is the owner to this key. HKEY AsioDriverKey = NULL; w32Error = RegOpenKeyEx(AsioPublicKey, DriverInfo[i].FriendlyName, 0, KEY_ALL_ACCESS, &AsioDriverKey); if (ERROR_SUCCESS == w32Error) { ULONG Type = 0; TCHAR AsioMarker[MAX_PATH]; ULONG Size = sizeof(AsioMarker); w32Error = RegQueryValueEx(AsioDriverKey, NULL, 0, &Type, PBYTE(AsioMarker), &Size); if (ERROR_SUCCESS == w32Error) { if (!_tcsicmp(AsioMarker, ASIO_MARKER)) { // Key belong us... ULONG Type = 0; WCHAR ClsIdStr[MAX_PATH]; ULONG Size = sizeof(ClsIdStr); w32Error = RegQueryValueExW(AsioDriverKey, L"CLSID", 0, &Type, PBYTE(ClsIdStr), &Size); if (ERROR_SUCCESS == w32Error) { CLSIDFromString(ClsIdStr, &DriverInfo[i].ClassId); } if (TargetSymbolicLink) { ULONG Type = 0; ULONG Size = sizeof(DriverInfo[i].SymbolicLink); w32Error = RegQueryValueEx(AsioDriverKey, "SymbolicLink", 0, &Type, PBYTE(DriverInfo[i].SymbolicLink), &Size); if (ERROR_SUCCESS == w32Error) { if (!_tcsicmp(TargetSymbolicLink, DriverInfo[i].SymbolicLink)) { FoundAsioDriverKey = TRUE; } } } else { FoundAsioDriverKey = TRUE; } } } RegCloseKey(AsioDriverKey); } if (FoundAsioDriverKey) { UnregisterAsioDriver(DriverInfo[i].FriendlyName, DriverInfo[i].ClassId); } } LocalFree(DriverInfo); } } RegCloseKey(AsioPublicKey); } return hr; }