@@ -71,10 +71,12 @@ unsafe fn nt_open_file(
71
71
}
72
72
73
73
/// Open the file `path` in the directory `parent`, requesting the given `access` rights.
74
+ /// `options` will be OR'd with `FILE_OPEN_REPARSE_POINT`.
74
75
fn open_link_no_reparse (
75
76
parent : & File ,
76
77
path : & [ u16 ] ,
77
78
access : u32 ,
79
+ options : u32 ,
78
80
) -> Result < Option < File > , WinError > {
79
81
// This is implemented using the lower level `NtOpenFile` function as
80
82
// unfortunately opening a file relative to a parent is not supported by
@@ -96,7 +98,7 @@ fn open_link_no_reparse(
96
98
..c:: OBJECT_ATTRIBUTES :: default ( )
97
99
} ;
98
100
let share = c:: FILE_SHARE_DELETE | c:: FILE_SHARE_READ | c:: FILE_SHARE_WRITE ;
99
- let options = c:: FILE_OPEN_REPARSE_POINT ;
101
+ let options = c:: FILE_OPEN_REPARSE_POINT | options ;
100
102
let result = nt_open_file ( access, & object, share, options) ;
101
103
102
104
// Retry without OBJ_DONT_REPARSE if it's not supported.
@@ -128,13 +130,20 @@ fn open_link_no_reparse(
128
130
}
129
131
130
132
fn open_dir ( parent : & File , name : & [ u16 ] ) -> Result < Option < File > , WinError > {
131
- open_link_no_reparse ( parent, name, c:: SYNCHRONIZE | c:: FILE_LIST_DIRECTORY )
133
+ // Open the directory for synchronous directory listing.
134
+ open_link_no_reparse (
135
+ parent,
136
+ name,
137
+ c:: SYNCHRONIZE | c:: FILE_LIST_DIRECTORY ,
138
+ // "_IO_NONALERT" means that a synchronous call won't be interrupted.
139
+ c:: FILE_SYNCHRONOUS_IO_NONALERT ,
140
+ )
132
141
}
133
142
134
143
fn delete ( parent : & File , name : & [ u16 ] ) -> Result < ( ) , WinError > {
135
144
// Note that the `delete` function consumes the opened file to ensure it's
136
145
// dropped immediately. See module comments for why this is important.
137
- match open_link_no_reparse ( parent, name, c:: SYNCHRONIZE | c :: DELETE ) {
146
+ match open_link_no_reparse ( parent, name, c:: DELETE , 0 ) {
138
147
Ok ( Some ( f) ) => f. delete ( ) ,
139
148
Ok ( None ) => Ok ( ( ) ) ,
140
149
Err ( e) => Err ( e) ,
0 commit comments