| |
| |
| |
| |
| |
| |
| #include <psxtypes/psxtypes.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; |
| |
| |
| 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(¶ms))) |
| return status; |
| |
| |
| for (wch=buffer, nbytes=params.bytes_written; nbytes; ) { |
| if (*wch == '/') |
| *wch = '\\'; |
| |
| nbytes -= sizeof(wchar16_t); |
| wch++; |
| } |
| |
| |
| path.maxlen = 0; |
| path.strlen = (uint16_t)params.bytes_written; |
| path.buffer = buffer; |
| |
| |
| 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; |
| |
| |
| 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); |
| } |