|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
diff --git a/src/iofn/psx_iofn_fsdir.c b/src/iofn/psx_iofn_fsdir.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
index 53b3380..8bdd7d8 100644
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
--- a/src/iofn/psx_iofn_fsdir.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+++ b/src/iofn/psx_iofn_fsdir.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
@@ -52,10 +52,34 @@ static int32_t __fastcall __psx_iofn_fsdir_open_next(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
path.buffer++;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
}
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ /* XXX */
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ uint32_t status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ static char name_buffer[1024];
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ nt_unicode_string * dev_name,full_path;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ iosb.info = 0;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if ((status = __ntapi->zw_query_object(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ path_info->hat,NT_OBJECT_NAME_INFORMATION,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ name_buffer,sizeof(name_buffer),(uint32_t *)&iosb.info)))
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ return status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ else {
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ dev_name = (nt_unicode_string *)name_buffer;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if ((dev_name->strlen > 2) &&
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ (dev_name->buffer[(dev_name->strlen - 1) / 2] != '\\')) {
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ dev_name->buffer[dev_name->strlen / 2] = '\\';
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ dev_name->strlen += 2;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ }
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ __ntapi->tt_generic_memcpy(&dev_name->buffer[dev_name->strlen / 2],
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ path.buffer,path.strlen);
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ dev_name->strlen += path.strlen;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ full_path.maxlen = (full_path.strlen = dev_name->strlen) + 2;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ full_path.buffer = dev_name->buffer;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ }
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
/* oa */
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
oa.len = sizeof(nt_oa);
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- oa.root_dir = path_info->hat;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- oa.obj_name = &pat;;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ oa.root_dir = 0;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ oa.obj_name = &full_path;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
oa.obj_attr = path_info->ntobjattr;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
oa.sec_desc = 0;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
oa.sec_qos = 0;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
@@ -73,6 +97,45 @@ static int32_t __fastcall __psx_iofn_fsdir_open_next(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
0,0);
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
}
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+static int32_t __stdcall __psx_iofn_fsdir_open_parent_directory(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ void ** hparent,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ void * hdir,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ uintptr_t * buffer,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ uint32_t buffer_size,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ uint32_t desired_access,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ uint32_t open_options,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ int32_t * type)
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+{
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ uint32_t status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ nt_io_status_block iosb;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ nt_file_internal_information fii_hdir,fii_hroot;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ struct __psx_tlca * tlca;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ tlca = __tlca_self();
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ status = __ntapi->zw_query_information_file(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ hdir,&iosb,&fii_hdir,sizeof(fii_hdir),
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ NT_FILE_INTERNAL_INFORMATION);
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if (status)
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ return status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ status = __ntapi->zw_query_information_file(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ tlca->ctx->root.hfile,&iosb,&fii_hroot,sizeof(fii_hroot),
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ NT_FILE_INTERNAL_INFORMATION);
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if (status)
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ return status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if (fii_hdir.index_number.quad == fii_hroot.index_number.quad) {
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ *hparent = hdir;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ *type = PSX_FD_OS_FS_ROOT;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ status = NT_STATUS_SUCCESS;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ } else
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ status = __ntapi->tt_open_physical_parent_directory(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ hparent,hdir,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ buffer,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ buffer_size,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ desired_access,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ open_options,type);
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ return status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+}
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
int32_t __stdcall __psx_iofn_fsdir_getvents(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
void * hfile,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
void * hevent,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
@@ -133,6 +196,6 @@ void __fastcall __psx_iofn_fsdir_init(struct __iovtbl * iovtbl)
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
iovtbl->getdents = __ntapi->zw_query_directory_file;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
iovtbl->getvents = __psx_iofn_fsdir_getvents;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- iovtbl->open_logical_parent = __ntapi->tt_open_logical_parent_directory;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- iovtbl->open_physical_parent = __ntapi->tt_open_physical_parent_directory;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ iovtbl->open_logical_parent = __psx_iofn_fsdir_open_parent_directory;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ iovtbl->open_physical_parent = __psx_iofn_fsdir_open_parent_directory;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
}
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
diff --git a/src/path/psx_path_parse.c b/src/path/psx_path_parse.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
index ff4d933..08431b6 100644
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
--- a/src/path/psx_path_parse.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+++ b/src/path/psx_path_parse.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
@@ -48,8 +48,8 @@ int32_t __fastcall __psx_parse_normalized_path_utf8(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
ch,
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
++(path_info->depth));
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- if (*(++ch)=='/') {
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- ch++;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if (ch[1]=='/') {
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ ch+=2;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
}
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
}
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
diff --git a/src/path/psx_path_resolve.c b/src/path/psx_path_resolve.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
index 2bd615c..705e646 100644
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
--- a/src/path/psx_path_resolve.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+++ b/src/path/psx_path_resolve.c
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
@@ -260,7 +260,7 @@ static int __fastcall __path_swap_at(
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
int32_t status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
/* swap */
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
- if (path_info->pathflags & PSX_PATH_CLOSE_AT)
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
+ if ((path_info->pathflags & PSX_PATH_CLOSE_AT) && (path_info->hat != path_info->hfile))
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
if ((status = __iovtbl[path_info->fdtypeat].close(path_info->hat)))
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
return status;
|
|
Lucio Andrés Illanes Albornoz (arab, vxp) |
1d0876 |
|