diff options
Diffstat (limited to 'src/gpgcemgr.c')
-rw-r--r-- | src/gpgcemgr.c | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/src/gpgcemgr.c b/src/gpgcemgr.c index da51602..d5d354e 100644 --- a/src/gpgcemgr.c +++ b/src/gpgcemgr.c @@ -24,10 +24,44 @@ #define PGM "gpgcemgr" -#warning Fixme: Add support to create the device. +#define GPGCEDEV_KEY_NAME L"Drivers\\GnuPG_Device" +#define GPGCEDEV_DLL_NAME L"gpgcedev.dll" +#define GPGCEDEV_PREFIX L"GPG" -int -main (int argc, char **argv) + +static int +install (void) +{ + HKEY handle; + DWORD disp, dw; + + if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, GPGCEDEV_KEY_NAME, 0, NULL, 0, + KEY_WRITE, NULL, &handle, &disp)) + { + fprintf (stderr, PGM": error creating registry key: rc=%d\n", + (int)GetLastError ()); + return 1; + } + + RegSetValueEx (handle, L"dll", 0, REG_SZ, + (void*)GPGCEDEV_DLL_NAME, sizeof (GPGCEDEV_DLL_NAME)); + RegSetValueEx (handle, L"prefix", 0, REG_SZ, + (void*)GPGCEDEV_PREFIX, sizeof (GPGCEDEV_PREFIX)); + + dw = 1; + RegSetValueEx (handle, L"Index", 0, REG_DWORD, (void*)&dw, sizeof dw); + + RegCloseKey (handle); + + fprintf (stderr, PGM": registry key created\n"); + + + return 0; +} + + +static int +deinstall (void) { int result = 0; HANDLE shd; @@ -63,6 +97,40 @@ main (int argc, char **argv) } FindClose (shd); } + + return result; +} + + + +int +main (int argc, char **argv) +{ + int result = 0; + + if (argc > 1 && !strcmp (argv[1], "--register")) + result = install (); + else if (argc > 1 && !strcmp (argv[1], "--deactivate")) + result = deinstall (); + else if (argc > 1 && !strcmp (argv[1], "--activate")) + { + /* This is mainly for testing. The activation is usually done + right before the device is opened. */ + if (ActivateDevice (GPGCEDEV_DLL_NAME, 0) == INVALID_HANDLE_VALUE) + { + fprintf (stderr, PGM": ActivateDevice failed: rc=%d\n", + (int)GetLastError ()); + result = 1; + } + else + fprintf (stderr, PGM": device activated\n"); + } + else + { + fprintf (stderr, "usage: " PGM " --register|--deactivate|--activate\n"); + result = 1; + } + fflush (stdout); fflush (stderr); Sleep (1000); |