39 assert(!
handle->req_pending);
42 sizeof(
handle->req.u.io.overlapped));
43 if (!ReadDirectoryChangesW(
handle->dir_handle,
47 FILE_NOTIFY_CHANGE_FILE_NAME |
48 FILE_NOTIFY_CHANGE_DIR_NAME |
49 FILE_NOTIFY_CHANGE_ATTRIBUTES |
50 FILE_NOTIFY_CHANGE_SIZE |
51 FILE_NOTIFY_CHANGE_LAST_WRITE |
52 FILE_NOTIFY_CHANGE_LAST_ACCESS |
53 FILE_NOTIFY_CHANGE_CREATION |
54 FILE_NOTIFY_CHANGE_SECURITY,
56 &
handle->req.u.io.overlapped,
70 size_t filenamelen = wcslen(
filename);
71 size_t dirlen = wcslen(dir);
72 assert(!_wcsnicmp(
filename, dir, dirlen));
73 if (dirlen > 0 && dir[dirlen - 1] ==
'\\')
75 relpathlen = filenamelen - dirlen - 1;
76 *relpath =
uv__malloc((relpathlen + 1) *
sizeof(WCHAR));
79 wcsncpy(*relpath,
filename + dirlen + 1, relpathlen);
80 (*relpath)[relpathlen] =
L'\0';
100 *dir = (WCHAR*)
uv__malloc((MAX_PATH + 1) *
sizeof(WCHAR));
105 if (!GetCurrentDirectoryW(MAX_PATH, *dir)) {
115 *dir = (WCHAR*)
uv__malloc((
i + 2) *
sizeof(WCHAR));
120 (*dir)[
i + 1] =
L'\0';
128 (*file)[
len -
i - 1] =
L'\0';
141 handle->short_filew = NULL;
154 unsigned int flags) {
155 int name_size, is_path_dir,
size;
156 DWORD
attr, last_error;
157 WCHAR* dir = NULL, *dir_to_watch, *pathw = NULL;
158 WCHAR short_path_buffer[MAX_PATH];
174 name_size = MultiByteToWideChar(CP_UTF8, 0,
path, -1, NULL, 0) *
181 if (!MultiByteToWideChar(CP_UTF8,
186 name_size /
sizeof(WCHAR))) {
191 attr = GetFileAttributesW(pathw);
192 if (
attr == INVALID_FILE_ATTRIBUTES) {
193 last_error = GetLastError();
197 is_path_dir = (
attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
203 size = GetLongPathNameW(pathw, NULL, 0);
225 dir_to_watch = pathw;
233 if (GetShortPathNameW(pathw,
236 short_path = short_path_buffer;
242 last_error = GetLastError();
247 last_error = GetLastError();
256 handle->dir_handle = CreateFileW(dir_to_watch,
258 FILE_SHARE_READ | FILE_SHARE_DELETE |
262 FILE_FLAG_BACKUP_SEMANTICS |
263 FILE_FLAG_OVERLAPPED,
272 last_error = GetLastError();
276 if (CreateIoCompletionPort(
handle->dir_handle,
280 last_error = GetLastError();
292 sizeof(
handle->req.u.io.overlapped));
294 if (!ReadDirectoryChangesW(
handle->dir_handle,
298 FILE_NOTIFY_CHANGE_FILE_NAME |
299 FILE_NOTIFY_CHANGE_DIR_NAME |
300 FILE_NOTIFY_CHANGE_ATTRIBUTES |
301 FILE_NOTIFY_CHANGE_SIZE |
302 FILE_NOTIFY_CHANGE_LAST_WRITE |
303 FILE_NOTIFY_CHANGE_LAST_ACCESS |
304 FILE_NOTIFY_CHANGE_CREATION |
305 FILE_NOTIFY_CHANGE_SECURITY,
307 &
handle->req.u.io.overlapped,
309 last_error = GetLastError();
313 assert(is_path_dir ? pathw != NULL : pathw == NULL);
329 if (
handle->short_filew) {
331 handle->short_filew = NULL;
337 CloseHandle(
handle->dir_handle);
358 CloseHandle(
handle->dir_handle);
369 if (
handle->short_filew) {
371 handle->short_filew = NULL;
394 str_len = wcslen(
str);
400 if (str_len != (file_name_len /
sizeof(WCHAR)))
403 return _wcsnicmp(
str, file_name, str_len);
409 FILE_NOTIFY_INFORMATION* file_info;
412 WCHAR* filenamew = NULL;
413 WCHAR* long_filenamew = NULL;
416 assert(
req->type == UV_FS_EVENT_REQ);
417 assert(
handle->req_pending);
431 file_info = (FILE_NOTIFY_INFORMATION*)(
handle->buffer +
offset);
434 if (
req->u.io.overlapped.InternalHigh > 0) {
436 file_info = (FILE_NOTIFY_INFORMATION*)((
char*)file_info +
offset);
439 assert(!long_filenamew);
448 file_info->FileNameLength) == 0 ||
451 file_info->FileNameLength) == 0) {
460 if (file_info->Action != FILE_ACTION_REMOVED &&
461 file_info->Action != FILE_ACTION_RENAMED_OLD_NAME) {
464 file_info->FileNameLength /
sizeof(WCHAR) + 2;
471 _snwprintf(filenamew,
size,
L"%s\\%.*s",
handle->dirw,
472 file_info->FileNameLength / (DWORD)
sizeof(WCHAR),
473 file_info->FileName);
475 filenamew[
size - 1] =
L'\0';
478 size = GetLongPathNameW(filenamew, NULL, 0);
482 if (!long_filenamew) {
486 size = GetLongPathNameW(filenamew, long_filenamew,
size);
488 long_filenamew[
size] =
'\0';
491 long_filenamew = NULL;
497 if (long_filenamew) {
503 long_filenamew = filenamew;
507 filenamew = file_info->FileName;
508 sizew = file_info->FileNameLength /
sizeof(WCHAR);
516 filenamew = file_info->FileName;
517 sizew = file_info->FileNameLength /
sizeof(WCHAR);
521 filenamew =
handle->filew;
528 switch (file_info->Action) {
529 case FILE_ACTION_ADDED:
530 case FILE_ACTION_REMOVED:
531 case FILE_ACTION_RENAMED_OLD_NAME:
532 case FILE_ACTION_RENAMED_NEW_NAME:
536 case FILE_ACTION_MODIFIED:
544 long_filenamew = NULL;
548 offset = file_info->NextEntryOffset;
571 if (!
handle->req_pending) {