2010-05-12 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (system_components): Remove custom cppflags from RCCOMPILE (because gpg-error adds -idirafter that makes RC bail. [HAVE_W32CE_SYSTEM]: Add w32-ce.h and w32-ce.c, clear libexec_PROGRAMS. * w32-ce.h, w32-ce.c: New files.
This commit is contained in:
parent
88906258ef
commit
ca3e5c63b9
@ -1,5 +1,11 @@
|
|||||||
2010-05-12 Marcus Brinkmann <marcus@g10code.de>
|
2010-05-12 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
|
* Makefile.am (system_components): Remove custom cppflags from
|
||||||
|
RCCOMPILE (because gpg-error adds -idirafter that makes RC bail.
|
||||||
|
[HAVE_W32CE_SYSTEM]: Add w32-ce.h and w32-ce.c, clear
|
||||||
|
libexec_PROGRAMS.
|
||||||
|
* w32-ce.h, w32-ce.c: New files.
|
||||||
|
|
||||||
* priv-io.h: Include <sys/types.h>
|
* priv-io.h: Include <sys/types.h>
|
||||||
* util.h: Likewise.
|
* util.h: Likewise.
|
||||||
|
|
||||||
|
@ -68,6 +68,10 @@ system_components = ath.h posix-util.c posix-sema.c posix-io.c
|
|||||||
system_components_not_extra =
|
system_components_not_extra =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if HAVE_W32CE_SYSTEM
|
||||||
|
system_components += w32-ce.h w32-ce.c
|
||||||
|
endif
|
||||||
|
|
||||||
if HAVE_GPGSM
|
if HAVE_GPGSM
|
||||||
gpgsm_components = engine-gpgsm.c
|
gpgsm_components = engine-gpgsm.c
|
||||||
else
|
else
|
||||||
@ -155,14 +159,17 @@ AM_CPPFLAGS = @GPG_ERROR_CFLAGS@ @PTH_CPPFLAGS@ \
|
|||||||
AM_CFLAGS = @LIBASSUAN_CFLAGS@ @PTH_CFLAGS@ @GLIB_CFLAGS@ @QT4_CORE_CFLAGS@
|
AM_CFLAGS = @LIBASSUAN_CFLAGS@ @PTH_CFLAGS@ @GLIB_CFLAGS@ @QT4_CORE_CFLAGS@
|
||||||
|
|
||||||
if HAVE_W32_SYSTEM
|
if HAVE_W32_SYSTEM
|
||||||
|
|
||||||
# Windows provides us with an endless stream of Tough Love. To spawn
|
# Windows provides us with an endless stream of Tough Love. To spawn
|
||||||
# processes with a controlled set of inherited handles, we need a
|
# processes with a controlled set of inherited handles, we need a
|
||||||
# wrapper process.
|
# wrapper process.
|
||||||
|
# Except on Windows CE. There nothing is inheritable anyway.
|
||||||
|
if HAVE_W32CE_SYSTEM
|
||||||
|
libexec_PROGRAMS =
|
||||||
|
else
|
||||||
libexec_PROGRAMS = gpgme-w32spawn
|
libexec_PROGRAMS = gpgme-w32spawn
|
||||||
|
endif
|
||||||
|
|
||||||
RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
|
||||||
$(AM_CPPFLAGS) $(CPPFLAGS)
|
|
||||||
LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
|
LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
|
||||||
|
|
||||||
SUFFIXES = .rc .lo
|
SUFFIXES = .rc .lo
|
||||||
|
405
src/w32-ce.c
Normal file
405
src/w32-ce.c
Normal file
@ -0,0 +1,405 @@
|
|||||||
|
/* w32-ce.h
|
||||||
|
Copyright (C) 2010 g10 Code GmbH
|
||||||
|
|
||||||
|
This file is part of GPGME.
|
||||||
|
|
||||||
|
GPGME 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.
|
||||||
|
|
||||||
|
GPGME 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 program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <gpg-error.h>
|
||||||
|
|
||||||
|
#include "w32-ce.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a malloced string encoded in UTF-8 from the wide char input
|
||||||
|
string STRING. Caller must free this value. Returns NULL and sets
|
||||||
|
ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
|
not defined. */
|
||||||
|
char *
|
||||||
|
wchar_to_utf8 (const wchar_t *string)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
gpg_err_set_errno (EINVAL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = malloc (n+1);
|
||||||
|
if (!result)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
free (result);
|
||||||
|
gpg_err_set_errno (EINVAL);
|
||||||
|
result = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a malloced wide char string from an UTF-8 encoded input
|
||||||
|
string STRING. Caller must free this value. Returns NULL and sets
|
||||||
|
ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
|
not defined. */
|
||||||
|
wchar_t *
|
||||||
|
utf8_to_wchar (const char *string)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
size_t nbytes;
|
||||||
|
wchar_t *result;
|
||||||
|
|
||||||
|
n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
gpg_err_set_errno (EINVAL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nbytes = (size_t)(n+1) * sizeof(*result);
|
||||||
|
if (nbytes / sizeof(*result) != (n+1))
|
||||||
|
{
|
||||||
|
gpg_err_set_errno (ENOMEM);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
result = malloc (nbytes);
|
||||||
|
if (!result)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
free (result);
|
||||||
|
gpg_err_set_errno (EINVAL);
|
||||||
|
result = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_ENV 30
|
||||||
|
|
||||||
|
char *environ[MAX_ENV + 1];
|
||||||
|
|
||||||
|
char *
|
||||||
|
getenv (const char *name)
|
||||||
|
{
|
||||||
|
static char *past_result;
|
||||||
|
char **envp;
|
||||||
|
|
||||||
|
if (past_result)
|
||||||
|
{
|
||||||
|
free (past_result);
|
||||||
|
past_result = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (! strcmp (name, "DBUS_VERBOSE"))
|
||||||
|
return past_result = get_verbose_setting ();
|
||||||
|
else if (! strcmp (name, "HOMEPATH"))
|
||||||
|
return past_result = find_my_documents_folder ();
|
||||||
|
else if (! strcmp (name, "DBUS_DATADIR"))
|
||||||
|
return past_result = find_inst_subdir ("share");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (envp = environ; *envp != 0; envp++)
|
||||||
|
{
|
||||||
|
const char *varp = name;
|
||||||
|
char *ep = *envp;
|
||||||
|
|
||||||
|
while (*varp == *ep && *varp != '\0')
|
||||||
|
{
|
||||||
|
++ep;
|
||||||
|
++varp;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (*varp == '\0' && *ep == '=')
|
||||||
|
return ep + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
GetSystemTimeAsFileTime (LPFILETIME ftp)
|
||||||
|
{
|
||||||
|
SYSTEMTIME st;
|
||||||
|
GetSystemTime (&st);
|
||||||
|
SystemTimeToFileTime (&st, ftp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
DeleteFileA (LPCSTR lpFileName)
|
||||||
|
{
|
||||||
|
wchar_t *filename;
|
||||||
|
BOOL result;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
filename = utf8_to_wchar (lpFileName);
|
||||||
|
if (!filename)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
result = DeleteFileW (filename);
|
||||||
|
|
||||||
|
err = GetLastError ();
|
||||||
|
free (filename);
|
||||||
|
SetLastError (err);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
CreateProcessA (LPCSTR pszImageName, LPSTR pszCmdLine,
|
||||||
|
LPSECURITY_ATTRIBUTES psaProcess,
|
||||||
|
LPSECURITY_ATTRIBUTES psaThread, BOOL fInheritHandles,
|
||||||
|
DWORD fdwCreate, PVOID pvEnvironment, LPCSTR pszCurDir,
|
||||||
|
LPSTARTUPINFOA psiStartInfo,
|
||||||
|
LPPROCESS_INFORMATION pProcInfo)
|
||||||
|
{
|
||||||
|
wchar_t *image_name = NULL;
|
||||||
|
wchar_t *cmd_line = NULL;
|
||||||
|
BOOL result;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
assert (psaProcess == NULL);
|
||||||
|
assert (psaThread == NULL);
|
||||||
|
assert (fInheritHandles == FALSE);
|
||||||
|
assert (pvEnvironment == NULL);
|
||||||
|
assert (pszCurDir == NULL);
|
||||||
|
/* psiStartInfo is generally not NULL. */
|
||||||
|
|
||||||
|
if (pszImageName)
|
||||||
|
{
|
||||||
|
image_name = utf8_to_wchar (pszImageName);
|
||||||
|
if (!image_name)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (pszCmdLine)
|
||||||
|
{
|
||||||
|
cmd_line = utf8_to_wchar (pszCmdLine);
|
||||||
|
if (!cmd_line)
|
||||||
|
{
|
||||||
|
if (image_name)
|
||||||
|
free (image_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = CreateProcessW (image_name, cmd_line, NULL, NULL, FALSE,
|
||||||
|
fdwCreate, NULL, NULL, NULL, pProcInfo);
|
||||||
|
|
||||||
|
err = GetLastError ();
|
||||||
|
free (image_name);
|
||||||
|
free (cmd_line);
|
||||||
|
SetLastError (err);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LONG
|
||||||
|
RegOpenKeyExA (HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions,
|
||||||
|
REGSAM samDesired, PHKEY phkResult)
|
||||||
|
{
|
||||||
|
wchar_t *subkey;
|
||||||
|
LONG result;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (lpSubKey)
|
||||||
|
{
|
||||||
|
subkey = utf8_to_wchar (lpSubKey);
|
||||||
|
if (!subkey)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
subkey = NULL;
|
||||||
|
|
||||||
|
result = RegOpenKeyEx (hKey, subkey, ulOptions, samDesired, phkResult);
|
||||||
|
|
||||||
|
err = GetLastError ();
|
||||||
|
free (subkey);
|
||||||
|
SetLastError (err);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LONG
|
||||||
|
RegQueryValueExA (HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved,
|
||||||
|
LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
|
||||||
|
{
|
||||||
|
wchar_t *name;
|
||||||
|
LONG err;
|
||||||
|
BYTE *data;
|
||||||
|
DWORD data_len;
|
||||||
|
DWORD type;
|
||||||
|
|
||||||
|
if (lpValueName)
|
||||||
|
{
|
||||||
|
name = utf8_to_wchar (lpValueName);
|
||||||
|
if (!name)
|
||||||
|
return GetLastError ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
name = NULL;
|
||||||
|
|
||||||
|
data_len = 0;
|
||||||
|
err = RegQueryValueExW (hKey, name, lpReserved, lpType, NULL, &data_len);
|
||||||
|
if (err || !lpcbData)
|
||||||
|
{
|
||||||
|
free (name);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = malloc (data_len + sizeof (wchar_t));
|
||||||
|
if (!data)
|
||||||
|
{
|
||||||
|
free (name);
|
||||||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = RegQueryValueExW (hKey, name, lpReserved, &type, data, &data_len);
|
||||||
|
if (lpType)
|
||||||
|
*lpType = type;
|
||||||
|
free (name);
|
||||||
|
/* If err is ERROR_MORE_DATA, there probably was a race condition.
|
||||||
|
We can punt this to the caller just as well. */
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* NOTE: REG_MULTI_SZ and REG_EXPAND_SZ not supported, because they
|
||||||
|
are not needed in this module. */
|
||||||
|
if (type == REG_SZ)
|
||||||
|
{
|
||||||
|
char *data_c;
|
||||||
|
int data_c_len;
|
||||||
|
|
||||||
|
/* This is valid since we allocated one more above. */
|
||||||
|
data[data_len] = '\0';
|
||||||
|
data[data_len + 1] = '\0';
|
||||||
|
|
||||||
|
data_c = wchar_to_utf8 ((wchar_t*) data);
|
||||||
|
if (!data_c)
|
||||||
|
return GetLastError();
|
||||||
|
|
||||||
|
data_c_len = strlen (data_c) + 1;
|
||||||
|
assert (data_c_len <= data_len + sizeof (wchar_t));
|
||||||
|
memcpy (data, data_c, data_c_len);
|
||||||
|
data_len = data_c_len;
|
||||||
|
free (data_c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* DATA and DATA_LEN now contain the result. */
|
||||||
|
if (lpData)
|
||||||
|
{
|
||||||
|
if (data_len > *lpcbData)
|
||||||
|
err = ERROR_MORE_DATA;
|
||||||
|
else
|
||||||
|
memcpy (lpData, data, data_len);
|
||||||
|
}
|
||||||
|
*lpcbData = data_len;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD
|
||||||
|
GetTempPathA (DWORD nBufferLength, LPSTR lpBuffer)
|
||||||
|
{
|
||||||
|
wchar_t dummy[1];
|
||||||
|
DWORD len;
|
||||||
|
|
||||||
|
len = GetTempPathW (0, dummy);
|
||||||
|
if (len == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
assert (len <= MAX_PATH);
|
||||||
|
|
||||||
|
/* Better be safe than sorry. MSDN doesn't say if len is with or
|
||||||
|
without terminating 0. */
|
||||||
|
len++;
|
||||||
|
|
||||||
|
{
|
||||||
|
wchar_t *buffer_w;
|
||||||
|
DWORD len_w;
|
||||||
|
char *buffer_c;
|
||||||
|
DWORD len_c;
|
||||||
|
|
||||||
|
buffer_w = malloc (sizeof (wchar_t) * len);
|
||||||
|
if (! buffer_w)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len_w = GetTempPathW (len, buffer_w);
|
||||||
|
/* Give up if we still can't get at it. */
|
||||||
|
if (len_w == 0 || len_w >= len)
|
||||||
|
{
|
||||||
|
free (buffer_w);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Better be really safe. */
|
||||||
|
buffer_w[len_w] = '\0';
|
||||||
|
|
||||||
|
buffer_c = wchar_to_utf8 (buffer_w);
|
||||||
|
free (buffer_w);
|
||||||
|
if (! buffer_c)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* strlen is correct (not _mbstrlen), because we want storage and
|
||||||
|
not string length. */
|
||||||
|
len_c = strlen (buffer_c) + 1;
|
||||||
|
if (len_c > nBufferLength)
|
||||||
|
return len_c;
|
||||||
|
|
||||||
|
strcpy (lpBuffer, buffer_c);
|
||||||
|
free (buffer_c);
|
||||||
|
return len_c - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR lpszPath, int nFolder,
|
||||||
|
BOOL fCreate)
|
||||||
|
{
|
||||||
|
wchar_t path[MAX_PATH];
|
||||||
|
char *path_c;
|
||||||
|
BOOL result;
|
||||||
|
|
||||||
|
path[0] = (wchar_t) 0;
|
||||||
|
result = SHGetSpecialFolderPathW (hwndOwner, path, nFolder, fCreate);
|
||||||
|
/* Note: May return false even if succeeds. */
|
||||||
|
|
||||||
|
path[MAX_PATH - 1] = (wchar_t) 0;
|
||||||
|
path_c = wchar_to_utf8 (path);
|
||||||
|
if (! path_c)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
strncpy (lpszPath, path_c, MAX_PATH);
|
||||||
|
free (path_c);
|
||||||
|
lpszPath[MAX_PATH - 1] = '\0';
|
||||||
|
return result;
|
||||||
|
}
|
70
src/w32-ce.h
Normal file
70
src/w32-ce.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/* w32-ce.h
|
||||||
|
Copyright (C) 2010 g10 Code GmbH
|
||||||
|
|
||||||
|
This file is part of GPGME.
|
||||||
|
|
||||||
|
GPGME 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.
|
||||||
|
|
||||||
|
GPGME 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 program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef GPGME_W32_CE_H
|
||||||
|
#define GPGME_W32_CE_H
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* For getaddrinfo. */
|
||||||
|
#define _MSV_VER 0x401
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* shlobj.h declares these only for _WIN32_IE that we don't want to define.
|
||||||
|
In any case, with mingw32ce we only get a SHGetSpecialFolderPath. */
|
||||||
|
#define SHGetSpecialFolderPathW SHGetSpecialFolderPath
|
||||||
|
BOOL WINAPI SHGetSpecialFolderPathA(HWND,LPSTR,int,BOOL);
|
||||||
|
BOOL WINAPI SHGetSpecialFolderPathW(HWND,LPWSTR,int,BOOL);
|
||||||
|
|
||||||
|
|
||||||
|
#define getenv _gpgme_wince_getenv
|
||||||
|
char *getenv (const char *name);
|
||||||
|
|
||||||
|
#include <io.h>
|
||||||
|
#define isatty(fd) 0
|
||||||
|
|
||||||
|
|
||||||
|
/* Windows CE is missing some Windows functions that we want. */
|
||||||
|
|
||||||
|
#define GetSystemTimeAsFileTime _gpgme_wince_GetSystemTimeAsFileTime
|
||||||
|
void GetSystemTimeAsFileTime (LPFILETIME ftp);
|
||||||
|
|
||||||
|
#define DeleteFileA _gpgme_wince_DeleteFileA
|
||||||
|
BOOL DeleteFileA(LPCSTR);
|
||||||
|
|
||||||
|
#define CreateProcessA _gpgme_wince_CreateProcessA
|
||||||
|
BOOL CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION);
|
||||||
|
|
||||||
|
#define RegOpenKeyExA _gpgme_wince_RegOpenKeyExA
|
||||||
|
LONG RegOpenKeyExA(HKEY,LPCSTR,DWORD,REGSAM,PHKEY);
|
||||||
|
|
||||||
|
#define RegQueryValueExA _gpgme_wince_RegQueryValueExA
|
||||||
|
LONG WINAPI RegQueryValueExA(HKEY,LPCSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
|
||||||
|
|
||||||
|
#define GetTempPathA _gpgme_wince_GetTempPathA
|
||||||
|
DWORD GetTempPathA(DWORD,LPSTR);
|
||||||
|
|
||||||
|
#define SHGetSpecialFolderPathA _gpgme_wince_SHGetSpecialFolderPathA
|
||||||
|
BOOL SHGetSpecialFolderPathA(HWND,LPSTR,int,BOOL);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* GPGME_W32_CE_H */
|
Loading…
Reference in New Issue
Block a user