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