/* * BrainLILO * U-Boot loader for electric dictionary. * * Copyright (C) 2019 C. Shirasaka * based on ** ResetKitHelper ** Soft/hard reset the electronic dictionary. ** ** Copyright (C) 2012 T. Kawada * * This file is licensed in MIT license. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ #define BRAINLILO_API extern "C" __declspec(dllexport) #include "BrainLILO.h" #include "BrainLILODrv.h" #include static bool g_initialized = false; static HANDLE g_helperHandle = NULL; static HINSTANCE g_hInstance; static void initialize() { if (g_initialized) return; g_initialized = true; } static void getThisDllDirectoryPath(LPWSTR buffer) { // retrive the path of the application. GetModuleFileName(g_hInstance, buffer, 512); const size_t notFound = (size_t)-1; size_t i = 0; size_t j = notFound; while (buffer[i]) { if (buffer[i] == L'/' || buffer[i] == L'\\') { j = i; } i++; } if (j == notFound) return; buffer[j] = 0; } static bool isDriverLoaded() { HANDLE handle; handle = CreateFile(L"LIN0:", GENERIC_READ | GENERIC_WRITE | FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 0, NULL); if (handle == INVALID_HANDLE_VALUE) handle = NULL; if (handle) { CloseHandle(handle); return true; } return false; } static bool addDriverToRegistry() { HKEY hKey; DWORD dw; RegCreateKeyEx(HKEY_LOCAL_MACHINE, (L"Drivers\\BuiltIn\\LILODrv"), 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hKey, &dw); dw = 0x0000; if (RegSetValueEx(hKey, (L"Index"), 0, REG_DWORD, (BYTE *)&dw, sizeof(DWORD)) != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } dw = 0x0100; if (RegSetValueEx(hKey, (L"Order"), 0, REG_DWORD, (BYTE *)&dw, sizeof(DWORD)) != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } if (RegSetValueEx(hKey, (L"Dll"), 0, REG_SZ, (BYTE *)(L"\\Windows\\BrainLILODrv.dll"), sizeof(TCHAR) * ((DWORD)wcslen((L"\\Windows\\BrainLILODrv.dll")) + 1)) != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } if (RegSetValueEx(hKey, (L"Prefix"), 0, REG_SZ, (BYTE *)(L"LIN"), sizeof(TCHAR) * ((DWORD)wcslen((L"LIN")) + 1)) != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } return true; } static void loadDriverIfNeeded() { if (isDriverLoaded()) return; OutputDebugString(L"BrainLILO: installing LILODriver..."); DWORD err; HANDLE driver = NULL; wchar_t driverPath[1024]; getThisDllDirectoryPath(driverPath); TCHAR newDriverPath[128]; getThisDllDirectoryPath(driverPath); wcscat(driverPath, L"\\BrainLILODrv.dll"); wcscpy(newDriverPath, L"\\Windows\\BrainLILODrv.dll"); { wchar_t buf[1024]; swprintf(buf, L"BrainLILO: copying \"%ls\" to \"%ls\"", driverPath, newDriverPath); OutputDebugString(buf); } if (!CopyFile(driverPath, newDriverPath, FALSE)) { if (GetFileAttributes(newDriverPath) == (DWORD)-1) { OutputDebugString(L"BrainLILO: failed to copy"); return; } } OutputDebugString(L"BrainLILO: registering BrainLILODriver..."); try { driver = RegisterDevice(L"LIN", 0, L"\\Windows\\BrainLILODrv.dll", 0); if (driver == INVALID_HANDLE_VALUE) driver = NULL; if (!driver) { driver = RegisterDevice(L"LIN", 0, L"BrainLILODrv.dll", 0); if (driver == INVALID_HANDLE_VALUE) driver = NULL; } err = GetLastError(); } catch (DWORD e) { err = e; } if (!driver && (err != 0x964)) { OutputDebugString(L"BrainLILO: failed to install..."); return; } } static void openDriver() { if (g_helperHandle) return; g_helperHandle = CreateFile(L"LIN0:", GENERIC_READ | GENERIC_WRITE | FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 0, NULL); if (g_helperHandle == INVALID_HANDLE_VALUE) g_helperHandle = NULL; } extern "C" BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: g_hInstance = hInstance; initialize(); loadDriverIfNeeded(); openDriver(); case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } BRAINLILO_API BOOL RKDoSoftReset() { initialize(); loadDriverIfNeeded(); openDriver(); return DeviceIoControl(g_helperHandle, IOCTL_LIN_DO_LINUX, NULL, 0, NULL, 0, NULL, NULL); }