1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Source file for missing WinCE functionality 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Copyright © 2012 RealVNC Ltd. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * This library is free software; you can redistribute it and/or 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * modify it under the terms of the GNU Lesser General Public 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * License as published by the Free Software Foundation; either 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * version 2.1 of the License, or (at your option) any later version. 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * This library is distributed in the hope that it will be useful, 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Lesser General Public License for more details. 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * You should have received a copy of the GNU Lesser General Public 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * License along with this library; if not, write to the Free Software 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch */ 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "missing.h" 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <config.h> 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <libusbi.h> 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <windows.h> 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// The registry path to store environment variables 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define ENVIRONMENT_REG_PATH _T("Software\\libusb\\environment") 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* Workaround getenv not being available on WinCE. 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Instead look in HKLM\Software\libusb\environment */ 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochchar *getenv(const char *name) 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch{ 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static char value[MAX_PATH]; 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch TCHAR wValue[MAX_PATH]; 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WCHAR wName[MAX_PATH]; 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DWORD dwType, dwData; 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HKEY hkey; 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LONG rc; 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!name) 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (MultiByteToWideChar(CP_UTF8, 0, name, -1, wName, MAX_PATH) <= 0) { 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch usbi_dbg("Failed to convert environment variable name to wide string"); 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch wName[MAX_PATH - 1] = 0; // Be sure it's NUL terminated 49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ENVIRONMENT_REG_PATH, 0, KEY_QUERY_VALUE, &hkey); 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (rc != ERROR_SUCCESS) { 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch usbi_dbg("Failed to open registry key for getenv with error %d", rc); 53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Attempt to read the key 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dwData = sizeof(wValue); 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch rc = RegQueryValueEx(hkey, wName, NULL, &dwType, 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch (LPBYTE)&wValue, &dwData); 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RegCloseKey(hkey); 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (rc != ERROR_SUCCESS) { 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch usbi_dbg("Failed to read registry key value for getenv with error %d", rc); 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (dwType != REG_SZ) { 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch usbi_dbg("Registry value was of type %d instead of REG_SZ", dwType); 67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Success in reading the key, convert from WCHAR to char 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (WideCharToMultiByte(CP_UTF8, 0, 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch wValue, dwData / sizeof(*wValue), 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch value, MAX_PATH, 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NULL, NULL) <= 0) { 75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch usbi_dbg("Failed to convert environment variable value to narrow string"); 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch value[MAX_PATH - 1] = 0; // Be sure it's NUL terminated 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return value; 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 81