ReactOS 0.4.15-dev-7924-g5949c20
reactos.cpp
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: BtrFS FSD for ReactOS
4 * FILE: dll/shellext/shellbtrfs/reactos.cpp
5 * PURPOSE: ReactOS glue for Win8.1
6 * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
7 */
8
9#include "shellext.h"
10#include <initguid.h>
11#include <ntddstor.h>
12#include <ndk/rtlfuncs.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17/* So that we can link */
18DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262,0x9370,0x4615,0xa1,0x3b,0x9f,0x55,0x39,0xda,0x4c,0x0a);
19
20/* Copied from ntoskrnl_vista */
22 PULONG uni_bytes_written,
23 PCCH utf8_src, ULONG utf8_bytes)
24{
26 ULONG i, j;
27 ULONG written;
28 ULONG ch;
29 ULONG utf8_trail_bytes;
30 WCHAR utf16_ch[3];
31 ULONG utf16_ch_len;
32
33 if (!utf8_src)
35 if (!uni_bytes_written)
37
38 written = 0;
40
41 for (i = 0; i < utf8_bytes; i++)
42 {
43 /* read UTF-8 lead byte */
44 ch = (BYTE)utf8_src[i];
45 utf8_trail_bytes = 0;
46 if (ch >= 0xf5)
47 {
48 ch = 0xfffd;
50 }
51 else if (ch >= 0xf0)
52 {
53 ch &= 0x07;
54 utf8_trail_bytes = 3;
55 }
56 else if (ch >= 0xe0)
57 {
58 ch &= 0x0f;
59 utf8_trail_bytes = 2;
60 }
61 else if (ch >= 0xc2)
62 {
63 ch &= 0x1f;
64 utf8_trail_bytes = 1;
65 }
66 else if (ch >= 0x80)
67 {
68 /* overlong or trail byte */
69 ch = 0xfffd;
71 }
72
73 /* read UTF-8 trail bytes */
74 if (i + utf8_trail_bytes < utf8_bytes)
75 {
76 for (j = 0; j < utf8_trail_bytes; j++)
77 {
78 if ((utf8_src[i + 1] & 0xc0) == 0x80)
79 {
80 ch <<= 6;
81 ch |= utf8_src[i + 1] & 0x3f;
82 i++;
83 }
84 else
85 {
86 ch = 0xfffd;
87 utf8_trail_bytes = 0;
89 break;
90 }
91 }
92 }
93 else
94 {
95 ch = 0xfffd;
96 utf8_trail_bytes = 0;
98 i = utf8_bytes;
99 }
100
101 /* encode ch as UTF-16 */
102 if ((ch > 0x10ffff) ||
103 (ch >= 0xd800 && ch <= 0xdfff) ||
104 (utf8_trail_bytes == 2 && ch < 0x00800) ||
105 (utf8_trail_bytes == 3 && ch < 0x10000))
106 {
107 /* invalid codepoint or overlong encoding */
108 utf16_ch[0] = 0xfffd;
109 utf16_ch[1] = 0xfffd;
110 utf16_ch[2] = 0xfffd;
111 utf16_ch_len = utf8_trail_bytes;
113 }
114 else if (ch >= 0x10000)
115 {
116 /* surrogate pair */
117 ch -= 0x010000;
118 utf16_ch[0] = 0xd800 + (ch >> 10 & 0x3ff);
119 utf16_ch[1] = 0xdc00 + (ch >> 0 & 0x3ff);
120 utf16_ch_len = 2;
121 }
122 else
123 {
124 /* single unit */
125 utf16_ch[0] = ch;
126 utf16_ch_len = 1;
127 }
128
129 if (!uni_dest)
130 {
131 written += utf16_ch_len;
132 continue;
133 }
134
135 for (j = 0; j < utf16_ch_len; j++)
136 {
137 if (uni_bytes_max >= sizeof(WCHAR))
138 {
139 *uni_dest++ = utf16_ch[j];
140 uni_bytes_max -= sizeof(WCHAR);
141 written++;
142 }
143 else
144 {
145 uni_bytes_max = 0;
147 }
148 }
149 }
150
151 *uni_bytes_written = written * sizeof(WCHAR);
152 return status;
153}
154
155/* Quick and dirty table for conversion */
156FILE_INFORMATION_CLASS ConvertToFileInfo[MaximumFileInfoByHandleClass] =
157{
162};
163
164/* Taken from kernel32 */
165DWORD
167{
168 DWORD dwErrCode;
169 dwErrCode = RtlNtStatusToDosError(Status);
170 SetLastError(dwErrCode);
171 return dwErrCode;
172}
173
174/* Quick implementation, still going farther than Wine implementation */
175BOOL
176WINAPI
179 LPVOID lpFileInformation,
180 DWORD dwBufferSize)
181{
184 FILE_INFORMATION_CLASS FileInfoClass;
185
186 FileInfoClass = (FILE_INFORMATION_CLASS)-1;
187
188 /* Attempt to convert the class */
189 if (FileInformationClass < MaximumFileInfoByHandleClass)
190 {
192 }
193
194 /* If wrong, bail out */
195 if (FileInfoClass == -1)
196 {
198 return FALSE;
199 }
200
201 /* And set the information */
202 Status = NtSetInformationFile(hFile, &IoStatusBlock, lpFileInformation,
203 dwBufferSize, FileInfoClass);
204
205 if (!NT_SUCCESS(Status))
206 {
208 return FALSE;
209 }
210
211 return TRUE;
212}
213#ifdef __cplusplus
214}
215#endif
LONG NTSTATUS
Definition: precomp.h:26
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
@ FileEndOfFileInformation
Definition: from_kernel.h:81
@ FileCompressionInformation
Definition: from_kernel.h:89
@ FileRenameInformation
Definition: from_kernel.h:71
@ FileIoPriorityHintInformation
Definition: from_kernel.h:104
@ FileAttributeTagInformation
Definition: from_kernel.h:96
@ FileIdBothDirectoryInformation
Definition: from_kernel.h:98
@ FileNameInformation
Definition: from_kernel.h:70
@ FileAllocationInformation
Definition: from_kernel.h:80
@ FileStreamInformation
Definition: from_kernel.h:83
@ FileBasicInformation
Definition: from_kernel.h:65
@ FileDispositionInformation
Definition: from_kernel.h:74
enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS
Definition: directory.c:44
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
@ FileRemoteProtocolInformation
Definition: winternl.h:501
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
static FILE_INFO_BY_HANDLE_CLASS
Definition: file.c:36
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
static OUT PIO_STATUS_BLOCK OUT PVOID IN ULONG IN FILE_INFORMATION_CLASS FileInformationClass
Definition: pipe.c:75
_In_ HANDLE hFile
Definition: mswsock.h:90
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
Definition: iofunc.c:3096
CONST CHAR * PCCH
Definition: ntbasedef.h:392
#define STATUS_INVALID_PARAMETER_4
Definition: ntstatus.h:478
#define STATUS_SOME_NOT_MAPPED
Definition: ntstatus.h:86
#define FileStandardInformation
Definition: propsheet.cpp:61
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
FILE_INFORMATION_CLASS ConvertToFileInfo[MaximumFileInfoByHandleClass]
Definition: reactos.cpp:156
NTSTATUS WINAPI RtlUTF8ToUnicodeN(PWSTR uni_dest, ULONG uni_bytes_max, PULONG uni_bytes_written, PCCH utf8_src, ULONG utf8_bytes)
Definition: reactos.cpp:21
BOOL WINAPI SetFileInformationByHandle(HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize)
Definition: reactos.cpp:177
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
Definition: ps.c:97
uint16_t * PWSTR
Definition: typedefs.h:56
uint32_t * PULONG
Definition: typedefs.h:59
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define WINAPI
Definition: msvc.h:6
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193