Added the shell function GetUserProfileDirectory to WinPR.

This commit is contained in:
Mike McDonald 2015-03-04 16:56:48 -05:00
parent 6dd333c4c8
commit aa6a737fbb
5 changed files with 207 additions and 1 deletions

View File

@ -0,0 +1,52 @@
/**
* WinPR: Windows Portable Runtime
* Shell Functions
*
* Copyright 2015 Dell Software <Mike.McDonald@software.dell.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef WINPR_SHELL_H
#define WINPR_SHELL_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winpr/winpr.h>
#include <winpr/wtypes.h>
#ifndef _WIN32
#ifdef __cplusplus
extern "C" {
#endif
WINPR_API BOOL GetUserProfileDirectoryA(HANDLE hToken, LPSTR lpProfileDir, LPDWORD lpcchSize);
WINPR_API BOOL GetUserProfileDirectoryW(HANDLE hToken, LPWSTR lpProfileDir, LPDWORD lpcchSize);
#ifdef __cplusplus
}
#endif
#ifdef UNICODE
#define GetUserProfileDirectory GetUserProfileDirectoryW
#else
#define GetUserProfileDirectory GetUserProfileDirectoryA
#endif
#endif
#endif /* WINPR_SHELL_H */

View File

@ -75,7 +75,7 @@ endmacro()
# Level "1" API as defined for MinCore.lib # Level "1" API as defined for MinCore.lib
set(WINPR_CORE synch locale library file comm pipe interlocked security set(WINPR_CORE synch locale library file comm pipe interlocked security
environment crypto registry credentials path io memory input environment crypto registry credentials path io memory input shell
heap utils error com timezone sysinfo pool handle thread) heap utils error com timezone sysinfo pool handle thread)
foreach(DIR ${WINPR_CORE}) foreach(DIR ${WINPR_CORE})

View File

@ -0,0 +1,18 @@
# WinPR: Windows Portable Runtime
# libwinpr-shell cmake build script
#
# Copyright 2015 Dell Software <Mike.McDonald@software.dell.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
winpr_module_add(shell.c)

View File

@ -0,0 +1,9 @@
set(MINWIN_LAYER "0")
set(MINWIN_GROUP "none")
set(MINWIN_MAJOR_VERSION "0")
set(MINWIN_MINOR_VERSION "0")
set(MINWIN_SHORT_NAME "shell")
set(MINWIN_LONG_NAME "Shell Functions")
set(MODULE_LIBRARY_NAME "${MINWIN_SHORT_NAME}")

View File

@ -0,0 +1,127 @@
/**
* WinPR: Windows Portable Runtime
* Shell Functions
*
* Copyright 2015 Dell Software <Mike.McDonald@software.dell.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <winpr/shell.h>
/**
* shell32.dll:
*
* GetUserProfileDirectoryA
* GetUserProfileDirectoryW
*/
#ifndef _WIN32
#include <winpr/crt.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <pwd.h>
#include <grp.h>
#include "../handle/handle.h"
#include "../security/security.h"
BOOL GetUserProfileDirectoryA(HANDLE hToken, LPSTR lpProfileDir, LPDWORD lpcchSize)
{
DWORD cchDirSize;
struct passwd* pw;
WINPR_ACCESS_TOKEN* token;
token = (WINPR_ACCESS_TOKEN*) hToken;
if ((token == NULL) || (token->Type != HANDLE_TYPE_ACCESS_TOKEN) || (lpcchSize == NULL))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
pw = getpwnam(token->Username);
if (pw == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
cchDirSize = strlen(pw->pw_dir) + 1;
if ((lpProfileDir == NULL) || (*lpcchSize < cchDirSize))
{
*lpcchSize = cchDirSize;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
ZeroMemory(lpProfileDir, *lpcchSize);
strcpy(lpProfileDir, pw->pw_dir);
*lpcchSize = cchDirSize;
return TRUE;
}
BOOL GetUserProfileDirectoryW(HANDLE hToken, LPWSTR lpProfileDir, LPDWORD lpcchSize)
{
BOOL bStatus;
DWORD cchSizeA;
LPSTR lpProfileDirA;
if (lpcchSize == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
cchSizeA = *lpcchSize;
lpProfileDirA = NULL;
if (lpProfileDir)
{
lpProfileDirA = (LPSTR) malloc(cchSizeA);
if (lpProfileDirA == NULL)
{
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
}
bStatus = GetUserProfileDirectoryA(hToken, lpProfileDirA, &cchSizeA);
if (bStatus)
{
MultiByteToWideChar(CP_ACP, 0, lpProfileDirA, cchSizeA, lpProfileDir, *lpcchSize);
}
if (lpProfileDirA)
{
free(lpProfileDirA);
}
*lpcchSize = cchSizeA;
return bStatus;
}
#endif