summaryrefslogtreecommitdiffhomepage
path: root/src/internal/ntapi_open.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-07-23 05:18:42 -0400
committermidipix <writeonce@midipix.org>2016-07-24 06:17:31 -0400
commitd37adb632055fffb8181ab8a11d5d1e4c7f47324 (patch)
treeb6c4ab0d95f2bfc35b0a37407926ebecced09c30 /src/internal/ntapi_open.c
parentd9600b02844336881afbf8b23e2a66670461906a (diff)
downloadntapi-d37adb632055fffb8181ab8a11d5d1e4c7f47324.tar.bz2
ntapi-d37adb632055fffb8181ab8a11d5d1e4c7f47324.tar.xz
internals: added __ntapi_tt_open_file_utf8() and __ntapi_tt_open_dir_utf8().
Diffstat (limited to 'src/internal/ntapi_open.c')
-rw-r--r--src/internal/ntapi_open.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/internal/ntapi_open.c b/src/internal/ntapi_open.c
new file mode 100644
index 0000000..e95b228
--- /dev/null
+++ b/src/internal/ntapi_open.c
@@ -0,0 +1,95 @@
+/********************************************************/
+/* ntapi: Native API core library */
+/* Copyright (C) 2013--2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */
+/********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <ntcon/ntcon.h>
+#include <ntapi/ntapi.h>
+#include "ntapi_impl.h"
+
+static int32_t __ntapi_tt_open_utf8(
+ void ** hfile,
+ void * hat,
+ const char * arg,
+ uint32_t options,
+ int fprivate,
+ wchar16_t * buffer,
+ uint32_t buflen)
+{
+ int32_t status;
+ nt_oa oa;
+ nt_iosb iosb;
+ nt_unicode_string path;
+ nt_unicode_conversion_params_utf8_to_utf16 params = {0,0,0,0,0,0,0,0,0};
+ wchar16_t * wch;
+ size_t nbytes;
+
+ /* utf-8 --> utf-16 */
+ params.src = (const unsigned char *)arg;
+ params.src_size_in_bytes = __ntapi->tt_string_null_offset_multibyte(arg);
+ params.dst = buffer;
+ params.dst_size_in_bytes = buflen;
+
+ if ((status = __ntapi->uc_convert_unicode_stream_utf8_to_utf16(&params)))
+ return status;
+
+ /* convenience */
+ for (wch=buffer, nbytes=params.bytes_written; nbytes; ) {
+ if (*wch == '/')
+ *wch = '\\';
+
+ nbytes -= sizeof(wchar16_t);
+ wch++;
+ }
+
+ /* path */
+ path.maxlen = 0;
+ path.strlen = (uint16_t)params.bytes_written;
+ path.buffer = buffer;
+
+ /* oa */
+ oa.len = sizeof(nt_oa);
+ oa.root_dir = (buffer[0]=='\\') ? 0 : hat;
+ oa.obj_name = &path;
+ oa.obj_attr = fprivate ? 0 : NT_OBJ_INHERIT;
+ oa.sec_desc = 0;
+ oa.sec_qos = 0;
+
+ /* open */
+ return __ntapi->zw_open_file(
+ hfile,
+ NT_SEC_SYNCHRONIZE | NT_FILE_READ_ATTRIBUTES | NT_FILE_READ_DATA,
+ &oa,&iosb,
+ NT_FILE_SHARE_READ | NT_FILE_SHARE_WRITE | NT_FILE_SHARE_DELETE,
+ options | NT_FILE_SYNCHRONOUS_IO_ALERT);
+}
+
+int32_t __ntapi_tt_open_file_utf8(
+ void ** hfile,
+ void * hat,
+ const char * arg,
+ int fprivate,
+ wchar16_t * buffer,
+ uint32_t buflen)
+{
+ return __ntapi_tt_open_utf8(
+ hfile,hat,arg,
+ NT_FILE_NON_DIRECTORY_FILE,
+ fprivate,buffer,buflen);
+}
+
+int32_t __ntapi_tt_open_dir_utf8(
+ void ** hfile,
+ void * hat,
+ const char * arg,
+ int fprivate,
+ wchar16_t * buffer,
+ uint32_t buflen)
+{
+ return __ntapi_tt_open_utf8(
+ hfile,hat,arg,
+ NT_FILE_DIRECTORY_FILE,
+ fprivate,buffer,buflen);
+}