#include "windef.h"
#include "winbase.h"
#include "strsafe.h"
#include <ntndk.h>
#include "apphelp.h"
Go to the source code of this file.
|
void | SdbpInitTempStr (PSDB_TMP_STR String) |
|
void | SdbpFreeTempStr (PSDB_TMP_STR String) |
|
void | SdbpResizeTempStr (PSDB_TMP_STR String, WORD newLength) |
|
BOOL | SdbpGetLongPathName (PCWSTR wszPath, PSDB_TMP_STR Result) |
|
BOOL | SdbpIsPathOnRemovableMedia (PCWSTR Path) |
|
BOOL | SdbpBuildSignMediaId (PSDB_TMP_STR LongPath) |
|
BOOL | SdbpResolvePath (PSDB_TMP_STR LongPath, PCWSTR wszPath) |
|
ACCESS_MASK | Wow64QueryFlag (void) |
|
NTSTATUS | SdbpOpenKey (PUNICODE_STRING FullPath, BOOL bMachine, ACCESS_MASK Access, PHANDLE KeyHandle) |
|
BOOL | SdbpGetPermLayersInternal (PUNICODE_STRING FullPath, PWSTR pwszLayers, PDWORD pdwBytes, BOOL bMachine) |
|
BOOL | SdbDeletePermLayerKeys (PCWSTR wszPath, BOOL bMachine) |
|
BOOL | SdbpMatchLayer (PCWSTR start, PCWSTR end, PCWSTR compare) |
|
BOOL | SdbpAppendLayer (PWSTR target, DWORD len, PCWSTR layer, PCWSTR end) |
|
BOOL WINAPI | AllowPermLayer (PCWSTR Path) |
|
BOOL WINAPI | SdbGetPermLayerKeys (PCWSTR wszPath, PWSTR pwszLayers, PDWORD pdwBytes, DWORD dwFlags) |
|
BOOL WINAPI | SdbSetPermLayerKeys (PCWSTR wszPath, PCWSTR wszLayers, BOOL bMachine) |
|
BOOL WINAPI | SetPermLayerState (PCWSTR wszPath, PCWSTR wszLayer, DWORD dwFlags, BOOL bMachine, BOOL bEnable) |
|
◆ APPCOMPAT_LAYER_KEY
#define APPCOMPAT_LAYER_KEY L"\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers" |
◆ DISALLOWED_LAYER_CHARS
#define DISALLOWED_LAYER_CHARS L" #!" |
◆ GPLK_MACHINE
◆ GPLK_USER
◆ LAYER_APPLY_TO_SYSTEM_EXES
#define LAYER_APPLY_TO_SYSTEM_EXES 1 |
◆ LAYER_SEPARATORS
◆ LAYER_UNK_FLAG2
◆ MAX_LAYER_LENGTH
◆ REG_SZ
◆ REGISTRY_MACHINE
#define REGISTRY_MACHINE L"\\Registry\\Machine" |
◆ SIGN_MEDIA_FMT
◆ SPACE_ONLY
◆ WIN32_NO_STATUS
◆ PSDB_TMP_STR
◆ SDB_TMP_STR
◆ AllowPermLayer()
Determine if we allow permission layers to apply on this file.
- Parameters
-
[in] | Path | Full pathname of the file, only the drive part is used. |
- Returns
- TRUE if we allow permission layer, FALSE if not.
Definition at line 320 of file layer.c.
322 WCHAR tmp[] = {
'A',
':',
'\\', 0 };
337 SHIM_INFO(
"\"%S\" not a full path we can operate on.\n",
Path);
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
PRTL_UNICODE_STRING_BUFFER Path
GLuint GLuint GLsizei GLenum type
Referenced by CLayerUIPropPage::InitFile().
◆ SdbDeletePermLayerKeys()
Definition at line 258 of file layer.c.
274 SHIM_INFO(
"Failed to delete value from Key \"%wZ\" Status 0x%lx\n", &FullKey,
Status);
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
void SdbpFreeTempStr(PSDB_TMP_STR String)
NTSTATUS SdbpOpenKey(PUNICODE_STRING FullPath, BOOL bMachine, ACCESS_MASK Access, PHANDLE KeyHandle)
BOOL SdbpResolvePath(PSDB_TMP_STR LongPath, PCWSTR wszPath)
NTSYSAPI NTSTATUS NTAPI NtDeleteValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName)
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define STATUS_OBJECT_NAME_NOT_FOUND
static PCWSTR BOOL bMachine
Referenced by SdbSetPermLayerKeys().
◆ SdbGetPermLayerKeys()
Read the layers specified for the application.
- Parameters
-
[in] | wszPath | Full pathname of the file. |
[out] | pwszLayers | On return, the layers set on the file. |
| pdwBytes | The size of the pwszLayers buffer in bytes, and on return the size of the data written (in bytes) |
[in] | dwFlags | The flags, [GPLK_USER | GPLK_MACHINE]. |
- Returns
- TRUE if it succeeds, FALSE if it fails.
Definition at line 364 of file layer.c.
368 DWORD dwBytes, dwTotal = 0;
371 SHIM_ERR(
"NULL parameter passed for wszPath or pdwBytes.\n");
383 dwTotal = dwBytes -
sizeof(
WCHAR);
390 dwBytes -=
sizeof(
WCHAR);
391 dwTotal +=
sizeof(
WCHAR);
400 dwTotal += dwBytes -
sizeof(
WCHAR);
405 dwTotal -=
sizeof(
WCHAR);
409 dwTotal +=
sizeof(
WCHAR);
void SdbpFreeTempStr(PSDB_TMP_STR String)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
BOOL SdbpResolvePath(PSDB_TMP_STR LongPath, PCWSTR wszPath)
static PWSTR PDWORD pdwBytes
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
BOOL SdbpGetPermLayersInternal(PUNICODE_STRING FullPath, PWSTR pwszLayers, PDWORD pdwBytes, BOOL bMachine)
Referenced by GetLayerInfo(), SdbGetMatchingExe(), and SetPermLayerState().
◆ SdbpAppendLayer()
Definition at line 295 of file layer.c.
STRSAFEAPI StringCbCatNW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc, size_t cbToAppend)
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
GLenum GLuint GLint GLint layer
#define NT_SUCCESS(StatCode)
Referenced by SetPermLayerState().
◆ SdbpBuildSignMediaId()
Definition at line 124 of file layer.c.
146 SignMedia = SignMedia << 1 ^ FindData.nFileSizeLow;
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
STRSAFEAPI StringCbCopyNW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc, size_t cbToCopy)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
void SdbpFreeTempStr(PSDB_TMP_STR String)
#define INVALID_HANDLE_VALUE
void SdbpResizeTempStr(PSDB_TMP_STR String, WORD newLength)
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
#define FILE_ATTRIBUTE_DIRECTORY
void SdbpInitTempStr(PSDB_TMP_STR String)
DWORD SdbpStrlen(PCWSTR string)
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI FindClose(HANDLE hFindFile)
Referenced by SdbpResolvePath().
◆ SdbpFreeTempStr()
◆ SdbpGetLongPathName()
Definition at line 75 of file layer.c.
DWORD WINAPI GetLastError(VOID)
void SdbpResizeTempStr(PSDB_TMP_STR String, WORD newLength)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
DWORD WINAPI GetLongPathNameW(IN LPCWSTR lpszShortPath, OUT LPWSTR lpszLongPath, IN DWORD cchBuffer)
Referenced by SdbpResolvePath().
◆ SdbpGetPermLayersInternal()
Definition at line 230 of file layer.c.
246 *
pdwBytes = PartialInfo->DataLength;
250 SHIM_INFO(
"Failed to read value info from Key \"%wZ\" Status 0x%lx\n", &FullKey,
Status);
_In_ ULONG _In_ ULONG _In_ ULONG Length
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
STRSAFEAPI StringCbCopyNW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc, size_t cbToCopy)
NTSTATUS SdbpOpenKey(PUNICODE_STRING FullPath, BOOL bMachine, ACCESS_MASK Access, PHANDLE KeyHandle)
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
#define NT_SUCCESS(StatCode)
static PWSTR PDWORD pdwBytes
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
static PCWSTR BOOL bMachine
Referenced by SdbGetPermLayerKeys().
◆ SdbpInitTempStr()
◆ SdbpIsPathOnRemovableMedia()
Definition at line 97 of file layer.c.
99 WCHAR tmp[] = {
'A',
':',
'\\',0 };
114 SHIM_INFO(
"\"%S\" not a full path we can operate on.\n",
Path);
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
PRTL_UNICODE_STRING_BUFFER Path
GLuint GLuint GLsizei GLenum type
Referenced by SdbpResolvePath().
◆ SdbpMatchLayer()
Definition at line 286 of file layer.c.
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
Referenced by SetPermLayerState().
◆ SdbpOpenKey()
Definition at line 190 of file layer.c.
207 SHIM_ERR(
"Unable to acquire user registry key, Error: 0x%lx\n",
Status);
222 SHIM_ERR(
"Unable to open Key \"%wZ\" Status 0x%lx\n", FullPath,
Status);
#define RTL_INIT_OBJECT_ATTRIBUTES(n, a)
#define OBJ_CASE_INSENSITIVE
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
#define APPCOMPAT_LAYER_KEY
DWORD SdbpStrsize(PCWSTR string)
ACCESS_MASK Wow64QueryFlag(void)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
NTSYSAPI NTSTATUS NTAPI RtlFormatCurrentUserKeyPath(_Out_ _At_(KeyPath->Buffer, __drv_allocatesMem(Mem) _Post_bytecap_(KeyPath->MaximumLength) _Post_bytecount_(KeyPath->Length)) PUNICODE_STRING KeyPath)
#define NT_SUCCESS(StatCode)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
static PCWSTR BOOL bMachine
Referenced by SdbDeletePermLayerKeys(), SdbpGetPermLayersInternal(), and SdbSetPermLayerKeys().
◆ SdbpResizeTempStr()
◆ SdbpResolvePath()
◆ SdbSetPermLayerKeys()
Set or clear the Layer key.
- Parameters
-
[in] | wszPath | Full pathname of the file. |
[in] | wszLayers | The layers to add (space separated), or an empty string / NULL to remove all layers. |
[in] | bMachine | TRUE to machine. |
- Returns
- TRUE if it succeeds, FALSE if it fails.
Definition at line 425 of file layer.c.
444 SHIM_INFO(
"Failed to write a value to Key \"%wZ\" Status 0x%lx\n", &FullKey,
Status);
BOOL SdbDeletePermLayerKeys(PCWSTR wszPath, BOOL bMachine)
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
void SdbpFreeTempStr(PSDB_TMP_STR String)
DWORD SdbpStrsize(PCWSTR string)
NTSTATUS SdbpOpenKey(PUNICODE_STRING FullPath, BOOL bMachine, ACCESS_MASK Access, PHANDLE KeyHandle)
BOOL SdbpResolvePath(PSDB_TMP_STR LongPath, PCWSTR wszPath)
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define STATUS_OBJECT_NAME_NOT_FOUND
NTSYSAPI NTSTATUS NTAPI NtSetValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN ULONG TitleIndex OPTIONAL, IN ULONG Type, IN PVOID Data, IN ULONG DataSize)
static PCWSTR BOOL bMachine
Referenced by SetPermLayerState().
◆ SetPermLayerState()
Adds or removes a single layer entry.
- Parameters
-
[in] | wszPath | Full pathname of the file. |
[in] | wszLayer | The layer to add or remove. |
[in] | dwFlags | Additional flags to add / remove [LAYER_APPLY_TO_SYSTEM_EXES | ???]. |
[in] | bMachine | When TRUE, the setting applies to all users, when FALSE only applies to the current user. |
[in] | bEnable | TRUE to enable, FALSE to disable a layer / flag specified. |
- Returns
- TRUE if it succeeds, FALSE if it fails.
Definition at line 467 of file layer.c.
471 DWORD dwBytes =
sizeof(fullLayer), dwWriteFlags = 0;
490 SHIM_ERR(
"Only one layer can be passed in at a time.\n");
494 SHIM_ERR(
"Flags cannot be passed in with the layer name.\n");
501 dwBytes =
sizeof(fullLayer);
509 else if (*
start ==
'!')
BOOL SdbpAppendLayer(PWSTR target, DWORD len, PCWSTR layer, PCWSTR end)
#define DISALLOWED_LAYER_CHARS
BOOL SdbpMatchLayer(PCWSTR start, PCWSTR end, PCWSTR compare)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
#define LAYER_APPLY_TO_SYSTEM_EXES
BOOL WINAPI SdbSetPermLayerKeys(PCWSTR wszPath, PCWSTR wszLayers, BOOL bMachine)
BOOL WINAPI SdbGetPermLayerKeys(PCWSTR wszPath, PWSTR pwszLayers, PDWORD pdwBytes, DWORD dwFlags)
_Check_return_ _CRTIMP _CONST_RETURN wchar_t *__cdecl wcspbrk(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_Control)
static PCWSTR BOOL bMachine
Referenced by CLayerUIPropPage::OnApply().
◆ Wow64QueryFlag()
Definition at line 179 of file layer.c.
static ACCESS_MASK g_QueryFlag
NTSTATUS NTAPI NtQueryInformationProcess(IN HANDLE ProcessHandle, IN PROCESSINFOCLASS ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL)
#define NtCurrentProcess()
#define NT_SUCCESS(StatCode)
Referenced by SdbpOpenKey(), SdbRegisterDatabaseEx(), and SdbUnregisterDatabase().
◆ g_QueryFlag