diff --git a/src/libopensc/Makefile.am b/src/libopensc/Makefile.am index c1172eb2..a3bea3c6 100644 --- a/src/libopensc/Makefile.am +++ b/src/libopensc/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/win32/ltrc.inc MAINTAINERCLEANFILES = $(srcdir)/Makefile.in -EXTRA_DIST = Makefile.mak +EXTRA_DIST = Makefile.mak opensc.dll.manifest lib_LTLIBRARIES = libopensc.la noinst_HEADERS = cards.h ctbcs.h internal.h esteid.h muscle.h muscle-filesystem.h \ diff --git a/src/libopensc/Makefile.mak b/src/libopensc/Makefile.mak index f0ee0838..5808f38e 100644 --- a/src/libopensc/Makefile.mak +++ b/src/libopensc/Makefile.mak @@ -55,8 +55,8 @@ opensc.dll: $(OBJECTS) $(LIBS) echo LIBRARY $* > $*.def echo EXPORTS >> $*.def type lib$*.exports >> $*.def - link $(LINKFLAGS) /dll /def:$*.def /implib:$*.lib /out:opensc.dll $(OBJECTS) $(LIBS) $(OPENPACE_LIB) $(OPENSSL_LIB) $(ZLIB_LIB) gdi32.lib advapi32.lib ws2_32.lib + link $(LINKFLAGS) /dll /def:$*.def /implib:$*.lib /out:opensc.dll $(OBJECTS) $(LIBS) $(OPENPACE_LIB) $(OPENSSL_LIB) $(ZLIB_LIB) gdi32.lib Comctl32.lib Shell32.lib user32.lib advapi32.lib ws2_32.lib if EXIST opensc.dll.manifest mt -manifest opensc.dll.manifest -outputresource:opensc.dll;2 opensc_a.lib: $(OBJECTS) $(LIBS) - lib $(LIBFLAGS) /out:opensc_a.lib $(OBJECTS) $(LIBS) $(OPENPACE_LIB) $(OPENSSL_LIB) $(ZLIB_LIB) user32.lib advapi32.lib ws2_32.lib + lib $(LIBFLAGS) /out:opensc_a.lib $(OBJECTS) $(LIBS) $(OPENPACE_LIB) $(OPENSSL_LIB) $(ZLIB_LIB) gdi32.lib Comctl32.lib Shell32.lib user32.lib advapi32.lib ws2_32.lib diff --git a/src/libopensc/opensc.dll.manifest b/src/libopensc/opensc.dll.manifest new file mode 100644 index 00000000..029b3537 --- /dev/null +++ b/src/libopensc/opensc.dll.manifest @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/minidriver/minidriver.c b/src/minidriver/minidriver.c index 22208004..b9157f92 100644 --- a/src/minidriver/minidriver.c +++ b/src/minidriver/minidriver.c @@ -47,7 +47,9 @@ #include "libopensc/log.h" #include "libopensc/internal.h" #include "libopensc/aux-data.h" +#include "ui/notify.h" #include "ui/strings.h" +#include "ui/wchar_from_char_str.h" #include "pkcs15init/pkcs15-init.h" #ifdef ENABLE_OPENSSL @@ -2476,31 +2478,6 @@ static const char *md_get_ui_str(PCARD_DATA pCardData, enum ui_str id) return str; } -static WCHAR *wchar_from_char_str(const char *in) -{ - WCHAR *out; - int out_len; - - if (!in) - return NULL; - - out_len = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0); - if (0 >= out_len) - return NULL; - - out = LocalAlloc(0, (sizeof *out) * out_len); - if (!out) - return NULL; - - out_len = MultiByteToWideChar(CP_UTF8, 0, in, -1, out, out_len); - if (out_len == 0xFFFD || 0 >= out_len) { - LocalFree(out); - return NULL; - } - - return out; -} - static INT_PTR CALLBACK md_dialog_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData) { LONG_PTR param; @@ -6250,10 +6227,13 @@ BOOL APIENTRY DllMain( HINSTANCE hinstDLL, { case DLL_PROCESS_ATTACH: g_inst = hinstDLL; + sc_notify_instance = hinstDLL; + sc_notify_init(); InitializeCriticalSection(&md_static_data.hScard_lock); md_static_data.attach_check = MD_STATIC_PROCESS_ATTACHED; break; case DLL_PROCESS_DETACH: + sc_notify_close(); DeleteCriticalSection(&md_static_data.hScard_lock); md_static_data.attach_check = 0; break; diff --git a/src/minidriver/versioninfo-minidriver.rc.in b/src/minidriver/versioninfo-minidriver.rc.in index f99d2b92..71a7089c 100644 --- a/src/minidriver/versioninfo-minidriver.rc.in +++ b/src/minidriver/versioninfo-minidriver.rc.in @@ -1,8 +1,26 @@ #include #define IDC_STATIC -1 -/* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */ -#define IDI_SMARTCARD 102 +/* defined twice: in ressource file and in source code */ +#define IDI_SMARTCARD 102 +#define IDI_UNLOCKED 103 +#define IDI_LOCKED 104 +#define IDI_READER_EMPTY 105 +#define IDI_CARD_INSERTED 106 + +#ifndef __MINGW32__ +IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "..\\..\\win32\\certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "..\\..\\win32\\certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "..\\..\\win32\\SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "..\\..\\win32\\SCardDlg.dll_14_143.ico" +#else +IDI_SMARTCARD ICON "../../win32/DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "../../win32/certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "../../win32/certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "../../win32/SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "../../win32/SCardDlg.dll_14_143.ico" +#endif VS_VERSION_INFO VERSIONINFO FILEVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ @@ -39,5 +57,3 @@ BEGIN VALUE "Translation", 0x409, 1200 END END - -IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" diff --git a/src/pkcs11/Makefile.am b/src/pkcs11/Makefile.am index 23cfa97d..24944910 100644 --- a/src/pkcs11/Makefile.am +++ b/src/pkcs11/Makefile.am @@ -1,7 +1,7 @@ include $(top_srcdir)/win32/ltrc.inc MAINTAINERCLEANFILES = $(srcdir)/Makefile.in $(srcdir)/versioninfo-pkcs11.rc $(srcdir)/versioninfo-pkcs11-spy.rc -EXTRA_DIST = Makefile.mak versioninfo-pkcs11.rc.in versioninfo-pkcs11-spy.rc.in opensc-pkcs11.pc.in +EXTRA_DIST = Makefile.mak versioninfo-pkcs11.rc.in versioninfo-pkcs11-spy.rc.in opensc-pkcs11.pc.in opensc-pkcs11.dll.manifest onepin-opensc-pkcs11.dll.manifest lib_LTLIBRARIES = opensc-pkcs11.la pkcs11-spy.la onepin-opensc-pkcs11.la diff --git a/src/pkcs11/onepin-opensc-pkcs11.dll.manifest b/src/pkcs11/onepin-opensc-pkcs11.dll.manifest new file mode 100644 index 00000000..029b3537 --- /dev/null +++ b/src/pkcs11/onepin-opensc-pkcs11.dll.manifest @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/pkcs11/opensc-pkcs11.dll.manifest b/src/pkcs11/opensc-pkcs11.dll.manifest new file mode 100644 index 00000000..029b3537 --- /dev/null +++ b/src/pkcs11/opensc-pkcs11.dll.manifest @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/pkcs11/versioninfo-pkcs11-spy.rc.in b/src/pkcs11/versioninfo-pkcs11-spy.rc.in index a4a1a281..f3a7f59e 100644 --- a/src/pkcs11/versioninfo-pkcs11-spy.rc.in +++ b/src/pkcs11/versioninfo-pkcs11-spy.rc.in @@ -1,5 +1,27 @@ #include +#define IDC_STATIC -1 +/* defined twice: in ressource file and in source code */ +#define IDI_SMARTCARD 102 +#define IDI_UNLOCKED 103 +#define IDI_LOCKED 104 +#define IDI_READER_EMPTY 105 +#define IDI_CARD_INSERTED 106 + +#ifndef __MINGW32__ +IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "..\\..\\win32\\certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "..\\..\\win32\\certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "..\\..\\win32\\SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "..\\..\\win32\\SCardDlg.dll_14_143.ico" +#else +IDI_SMARTCARD ICON "../../win32/DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "../../win32/certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "../../win32/certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "../../win32/SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "../../win32/SCardDlg.dll_14_143.ico" +#endif + VS_VERSION_INFO VERSIONINFO FILEVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ PRODUCTVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ @@ -35,4 +57,3 @@ BEGIN VALUE "Translation", 0x409, 1200 END END - diff --git a/src/pkcs11/versioninfo-pkcs11.rc.in b/src/pkcs11/versioninfo-pkcs11.rc.in index e8bc91d3..946d3f8e 100644 --- a/src/pkcs11/versioninfo-pkcs11.rc.in +++ b/src/pkcs11/versioninfo-pkcs11.rc.in @@ -1,5 +1,27 @@ #include +#define IDC_STATIC -1 +/* defined twice: in ressource file and in source code */ +#define IDI_SMARTCARD 102 +#define IDI_UNLOCKED 103 +#define IDI_LOCKED 104 +#define IDI_READER_EMPTY 105 +#define IDI_CARD_INSERTED 106 + +#ifndef __MINGW32__ +IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "..\\..\\win32\\certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "..\\..\\win32\\certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "..\\..\\win32\\SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "..\\..\\win32\\SCardDlg.dll_14_143.ico" +#else +IDI_SMARTCARD ICON "../../win32/DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "../../win32/certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "../../win32/certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "../../win32/SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "../../win32/SCardDlg.dll_14_143.ico" +#endif + VS_VERSION_INFO VERSIONINFO FILEVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ PRODUCTVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ @@ -35,4 +57,3 @@ BEGIN VALUE "Translation", 0x409, 1200 END END - diff --git a/src/smm/Makefile.am b/src/smm/Makefile.am index 50d8cd89..ce5e4c42 100644 --- a/src/smm/Makefile.am +++ b/src/smm/Makefile.am @@ -2,7 +2,7 @@ MAINTAINERCLEANFILES = Makefile.in -EXTRA_DIST = Makefile.mak +EXTRA_DIST = Makefile.mak smm-local.dll.manifest AM_CFLAGS = $(OPTIONAL_OPENSSL_CFLAGS) $(OPTIONAL_READLINE_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/common -I$(top_builddir)/src/include diff --git a/src/smm/smm-local.dll.manifest b/src/smm/smm-local.dll.manifest new file mode 100644 index 00000000..029b3537 --- /dev/null +++ b/src/smm/smm-local.dll.manifest @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/tools/Makefile.mak b/src/tools/Makefile.mak index 2032c94a..c3ef65c5 100644 --- a/src/tools/Makefile.mak +++ b/src/tools/Makefile.mak @@ -24,4 +24,4 @@ $(TARGETS): $(OBJECTS) $(LIBS) .c.exe: cl $(COPTS) /c $< link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj $(OBJECTS) $(LIBS) $(OPENPACE_LIB) $(OPENSSL_LIB) gdi32.lib shell32.lib ws2_32.lib - if EXIST $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + mt -manifest exe.manifest -outputresource:$@;1 diff --git a/src/tools/exe.manifest b/src/tools/exe.manifest new file mode 100644 index 00000000..029b3537 --- /dev/null +++ b/src/tools/exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/tools/versioninfo-tools.rc.in b/src/tools/versioninfo-tools.rc.in index 444b1a25..2c7f14c5 100644 --- a/src/tools/versioninfo-tools.rc.in +++ b/src/tools/versioninfo-tools.rc.in @@ -1,5 +1,27 @@ #include +#define IDC_STATIC -1 +/* defined twice: in ressource file and in source code */ +#define IDI_SMARTCARD 102 +#define IDI_UNLOCKED 103 +#define IDI_LOCKED 104 +#define IDI_READER_EMPTY 105 +#define IDI_CARD_INSERTED 106 + +#ifndef __MINGW32__ +IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "..\\..\\win32\\certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "..\\..\\win32\\certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "..\\..\\win32\\SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "..\\..\\win32\\SCardDlg.dll_14_143.ico" +#else +IDI_SMARTCARD ICON "../../win32/DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "../../win32/certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "../../win32/certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "../../win32/SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "../../win32/SCardDlg.dll_14_143.ico" +#endif + VS_VERSION_INFO VERSIONINFO FILEVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ PRODUCTVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ diff --git a/src/ui/Makefile.am b/src/ui/Makefile.am index f64f24fd..5a29358f 100644 --- a/src/ui/Makefile.am +++ b/src/ui/Makefile.am @@ -4,7 +4,7 @@ MAINTAINERCLEANFILES = $(srcdir)/Makefile.in EXTRA_DIST = Makefile.mak noinst_LTLIBRARIES = libstrings.la libnotify.la -noinst_HEADERS = strings.h notify.h +noinst_HEADERS = strings.h notify.h wchar_from_char_str.h AM_CPPFLAGS = -I$(top_srcdir)/src AM_CFLAGS = $(OPTIONAL_OPENSSL_CFLAGS) $(OPTIONAL_NOTIFY_CFLAGS) diff --git a/src/ui/notify.c b/src/ui/notify.c index 1be6706b..faad0af8 100644 --- a/src/ui/notify.c +++ b/src/ui/notify.c @@ -24,7 +24,7 @@ #include "notify.h" -#if defined(ENABLE_NOTIFY) && (defined(__APPLE__) || defined(GDBUS)) +#if defined(ENABLE_NOTIFY) && (defined(__APPLE__) || (defined(GDBUS) && !defined(_WIN32))) #include "libopensc/log.h" #include @@ -63,7 +63,216 @@ void sc_notify_close(void) #endif -#if defined(ENABLE_NOTIFY) && defined(__APPLE__) +#if defined(ENABLE_NOTIFY) && defined(_WIN32) + +#include "wchar_from_char_str.h" +#include + +static const GUID myGUID = {0x23977b55, 0x10e0, 0x4041, {0xb8, + 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x69}}; +HINSTANCE sc_notify_instance = NULL; +HWND hwndNotification = NULL; +#define IDI_SMARTCARD 102 +#define IDI_UNLOCKED 103 +#define IDI_LOCKED 104 +#define IDI_READER_EMPTY 105 +#define IDI_CARD_INSERTED 106 +UINT const WMAPP_NOTIFYCALLBACK = WM_APP + 1; +BOOL RestoreTooltip(void); + +// we need commctrl v6 for LoadIconMetric() +#include + +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + if ((message == WM_DESTROY) + || (message == WMAPP_NOTIFYCALLBACK + && (LOWORD(lParam) == NIN_BALLOONTIMEOUT + || LOWORD(lParam) == NIN_BALLOONUSERCLICK))) { +#if 0 + DeleteNotificationIcon(); +#else + RestoreTooltip(); +#endif + return TRUE; + } + + return DefWindowProc(hwnd, message, wParam, lParam); +} + +static const char* class_name = "DUMMY_CLASS"; +static const char* window_name = "DUMMY_WINDOW"; + +static BOOL create_invisible_window(void) +{ + if (!hwndNotification) { + //Register Window class + WNDCLASSEX wx = {0}; + wx.cbSize = sizeof(WNDCLASSEX); + wx.lpfnWndProc = WndProc; // function which will handle messages + wx.hInstance = sc_notify_instance; + wx.lpszClassName = class_name; + if (!RegisterClassEx(&wx)) { + return FALSE; + } + /* create window */ + hwndNotification = CreateWindowEx(0, class_name, window_name, + 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL ); + } + + if (hwndNotification) { + return TRUE; + } + + return FALSE; +} + +static BOOL delete_invisible_window(void) +{ + BOOL r; + r = DestroyWindow(hwndNotification); + r &= UnregisterClass(class_name, sc_notify_instance); + + hwndNotification = NULL; + + return r; +} + +static BOOL AddNotificationIcon(void) +{ + NOTIFYICONDATA nid = {sizeof(nid)}; + TCHAR path[MAX_PATH]={0}; + BOOL r; + + if (!create_invisible_window()) { + return FALSE; + } + + nid.hWnd = hwndNotification; + // add the icon, setting the icon, tooltip, and callback message. + // the icon will be identified with the GUID + nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP | NIF_GUID; + nid.guidItem = myGUID; + nid.uCallbackMessage = WMAPP_NOTIFYCALLBACK; + LoadIconMetric(sc_notify_instance, MAKEINTRESOURCEW(IDI_SMARTCARD), LIM_SMALL, &nid.hIcon); + if (GetModuleFileName(NULL, path, ARRAYSIZE(path))) { + strcpy_s(nid.szTip, ARRAYSIZE(nid.szTip), path); + } else { + strcpy(nid.szTip, PACKAGE_NAME); + } + + r = Shell_NotifyIcon(NIM_ADD, &nid); + + nid.uVersion = NOTIFYICON_VERSION_4; + r &= Shell_NotifyIcon(NIM_SETVERSION, &nid); + + return r; +} + +static BOOL DeleteNotificationIcon(void) +{ + BOOL r; + NOTIFYICONDATA nid = {sizeof(nid)}; + + nid.uFlags = NIF_GUID; + nid.guidItem = myGUID; + + r = Shell_NotifyIcon(NIM_DELETE, &nid); + r &= delete_invisible_window(); + + return r; +} + +static BOOL RestoreTooltip() +{ + // After the balloon is dismissed, restore the tooltip. + NOTIFYICONDATA nid = {sizeof(nid)}; + + nid.uFlags = NIF_SHOWTIP | NIF_GUID; + nid.guidItem = myGUID; + + return Shell_NotifyIcon(NIM_MODIFY, &nid); +} + +static void notify_shell(struct sc_context *ctx, + const char *title, const char *text, WORD icon) +{ + NOTIFYICONDATA nid = {sizeof(nid)}; + + nid.uFlags = NIF_GUID; + nid.guidItem = myGUID; + + if (title) { + strcpy_s(nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle), title); + } + if (text) { + nid.uFlags |= NIF_INFO; + strcpy_s(nid.szInfo, ARRAYSIZE(nid.szInfo), text); + } + if (icon) { + nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON; + LoadIconMetric(sc_notify_instance, MAKEINTRESOURCEW(icon), LIM_LARGE, &nid.hBalloonIcon); + } + + Shell_NotifyIcon(NIM_MODIFY, &nid); +} + +void sc_notify_init(void) +{ + if (!sc_notify_instance) { + /* returns the HINSTANCE of the exe. If the code executes in a DLL, + * sc_notify_instance_notify should be pre-initialized */ + sc_notify_instance = GetModuleHandle(NULL); + } + AddNotificationIcon(); +} + +void sc_notify_close(void) +{ + DeleteNotificationIcon(); +} + +void sc_notify(const char *title, const char *text) +{ + notify_shell(NULL, title, text, 0); +} + +void sc_notify_id(struct sc_context *ctx, struct sc_atr *atr, + struct sc_pkcs15_card *p15card, enum ui_str id) +{ + const char *title, *text, *group; + WORD icon; + title = ui_get_str(ctx, atr, p15card, id); + text = ui_get_str(ctx, atr, p15card, id+1); + + if (p15card && p15card->card && p15card->card->reader) { + group = p15card->card->reader->name; + } else { + group = ctx ? ctx->app_name : NULL; + } + + switch (id) { + case NOTIFY_CARD_INSERTED: + icon = IDI_CARD_INSERTED; + break; + case NOTIFY_CARD_REMOVED: + icon = IDI_READER_EMPTY; + break; + case NOTIFY_PIN_GOOD: + icon = IDI_UNLOCKED; + break; + case NOTIFY_PIN_BAD: + icon = IDI_LOCKED; + break; + default: + icon = 0; + break; + } + + notify_shell(ctx, title, text, icon); +} + +#elif defined(ENABLE_NOTIFY) && defined(__APPLE__) static void notify_proxy(struct sc_context *ctx, const char *title, const char* subtitle, @@ -169,7 +378,7 @@ void sc_notify_id(struct sc_context *ctx, struct sc_atr *atr, notify_proxy(ctx, title, NULL, text, icon, NULL, group); } -#elif defined(ENABLE_NOTIFY) && defined(GDBUS) +#elif defined(ENABLE_NOTIFY) && defined(GDBUS) && !defined(_WIN32) #include /* save the notification's id for replacement with a new one */ diff --git a/src/ui/notify.h b/src/ui/notify.h index d290cb1b..d32d69dd 100644 --- a/src/ui/notify.h +++ b/src/ui/notify.h @@ -33,6 +33,14 @@ void sc_notify(const char *title, const char *text); void sc_notify_id(struct sc_context *ctx, struct sc_atr *atr, struct sc_pkcs15_card *p15card, enum ui_str id); +#ifdef _WIN32 +#include +/* If the code executes in a DLL, `sc_notify_instance_notify` should be + * initialized before calling `sc_notify_init()`. If not initialized, we're + * using the HINSTANCE of the EXE */ +extern HINSTANCE sc_notify_instance; +#endif + #ifdef __cplusplus } #endif diff --git a/src/ui/wchar_from_char_str.h b/src/ui/wchar_from_char_str.h new file mode 100644 index 00000000..359f16da --- /dev/null +++ b/src/ui/wchar_from_char_str.h @@ -0,0 +1,44 @@ +/* + * wchar_from_char_str.h: Conversion from string to wide string + * + * Copyright (C) 2017 Frank Morgner + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +static WCHAR *wchar_from_char_str(const char *in) +{ + WCHAR *out; + int out_len; + + if (!in) + return NULL; + + out_len = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0); + if (0 >= out_len) + return NULL; + + out = LocalAlloc(0, (sizeof *out) * out_len); + if (!out) + return NULL; + + out_len = MultiByteToWideChar(CP_UTF8, 0, in, -1, out, out_len); + if (out_len == 0xFFFD || 0 >= out_len) { + LocalFree(out); + return NULL; + } + + return out; +} diff --git a/win32/Make.rules.mak b/win32/Make.rules.mak index 8780dadb..2c14ad6f 100644 --- a/win32/Make.rules.mak +++ b/win32/Make.rules.mak @@ -125,10 +125,10 @@ ALL_INCLUDES = /I$(TOPDIR)\win32 /I$(TOPDIR)\src $(OPENPACE_INCL_DIR) $(OPENSSL_ !IF "$(DEBUG_DEF)" == "/DDEBUG" LINKDEBUGFLAGS = /NODEFAULTLIB:LIBCMT /DEBUG CODE_OPTIMIZATION = -COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MTd /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" /DDEBUG /Zi /Od +COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MTd /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /DWINVER=0x0601 /D_WIN32_WINNT=0x0601 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" /DDEBUG /Zi /Od !ELSE LINKDEBUGFLAGS = /NODEFAULTLIB:LIBCMTD -COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MT /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" +COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MT /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /DWINVER=0x0601 /D_WIN32_WINNT=0x0601 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" !ENDIF diff --git a/win32/SCardDlg.dll_14_142.ico b/win32/SCardDlg.dll_14_142.ico new file mode 100644 index 00000000..5fe23fe2 Binary files /dev/null and b/win32/SCardDlg.dll_14_142.ico differ diff --git a/win32/SCardDlg.dll_14_143.ico b/win32/SCardDlg.dll_14_143.ico new file mode 100644 index 00000000..e14f89de Binary files /dev/null and b/win32/SCardDlg.dll_14_143.ico differ diff --git a/win32/certmgr.dll_14_452.ico b/win32/certmgr.dll_14_452.ico new file mode 100644 index 00000000..457af40f Binary files /dev/null and b/win32/certmgr.dll_14_452.ico differ diff --git a/win32/certmgr.dll_14_6170.ico b/win32/certmgr.dll_14_6170.ico new file mode 100644 index 00000000..23571d78 Binary files /dev/null and b/win32/certmgr.dll_14_6170.ico differ diff --git a/win32/versioninfo.rc.in b/win32/versioninfo.rc.in index fb340840..246efa6d 100644 --- a/win32/versioninfo.rc.in +++ b/win32/versioninfo.rc.in @@ -1,5 +1,27 @@ #include +#define IDC_STATIC -1 +/* defined twice: in ressource file and in source code */ +#define IDI_SMARTCARD 102 +#define IDI_UNLOCKED 103 +#define IDI_LOCKED 104 +#define IDI_READER_EMPTY 105 +#define IDI_CARD_INSERTED 106 + +#ifndef __MINGW32__ +IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "..\\..\\win32\\certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "..\\..\\win32\\certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "..\\..\\win32\\SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "..\\..\\win32\\SCardDlg.dll_14_143.ico" +#else +IDI_SMARTCARD ICON "../../win32/DDORes.dll_14_2302.ico" +IDI_UNLOCKED ICON "../../win32/certmgr.dll_14_6170.ico" +IDI_LOCKED ICON "../../win32/certmgr.dll_14_452.ico" +IDI_READER_EMPTY ICON "../../win32/SCardDlg.dll_14_142.ico" +IDI_CARD_INSERTED ICON "../../win32/SCardDlg.dll_14_143.ico" +#endif + VS_VERSION_INFO VERSIONINFO FILEVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ PRODUCTVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ @@ -35,4 +57,3 @@ BEGIN VALUE "Translation", 0x409, 1200 END END - diff --git a/win32/winconfig.h.in b/win32/winconfig.h.in index f1706661..298bbbd1 100644 --- a/win32/winconfig.h.in +++ b/win32/winconfig.h.in @@ -82,6 +82,8 @@ #define DEFAULT_PCSC_PROVIDER "@DEFAULT_PCSC_PROVIDER@" #endif +#define ENABLE_NOTIFY + #define SC_PKCS15_PROFILE_DIRECTORY "C:\\Program Files\\OpenSC Project\\OpenSC\\profiles" #define PATH_MAX FILENAME_MAX