<div dir="ltr"><div><div>I have confirmed with the following test program that exclusive open actually denies deletion of a hard link to the same file.  <br><br></div>This program just (1) creates normal file foo, (2) creates hard link bar for foo, (3) opens foo for deletion, (4) waits for input, and (5) close the handle returned in (3).  I checked if I could delete bar at (4).<br>
<br></div>If I changed the share mode to FILE_SHARE_DELETE, deletion and rename of bar is not denied.  I am not sure if it is OK with that share mode to delete a file name immediately.<br><div><div><div><br><font face="courier new,monospace">#include <windows.h><br>
#include <cstdio><br>using namespace std;<br><br>//#define SHARE_MODE 0<br>#define SHARE_MODE FILE_SHARE_DELETE<br><br>int main(void) {<br>    HANDLE fh = CreateFile("foo", GENERIC_READ | GENERIC_WRITE,<br>
            FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,<br>            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);<br>    if (fh == INVALID_HANDLE_VALUE) {<br>        fprintf(stderr, "%s: CreateFile failed (error = %lu)\n", "foo",<br>
                GetLastError());<br>        return 1;<br>    }<br>    CloseHandle(fh);<br><br>    if (!CreateHardLink("bar", "foo", NULL)) {<br>        fprintf(stderr, "%s: CreateHardLink failed (error = %lu)\n", "bar",<br>
                GetLastError());<br>        return 1;<br>    }<br><br>    fh = CreateFile("foo", DELETE, SHARE_MODE, NULL, OPEN_EXISTING,<br>            FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_DELETE_ON_CLOSE, NULL);<br>
    if (fh == INVALID_HANDLE_VALUE) {<br>        fprintf(stderr, "%s: CreateFile failed (error = %lu)\n", "foo",<br>                GetLastError());<br>    }<br><br>    printf("foo is now open\n");<br>
<br>    char line[80];<br>    fgets(line, 80, stdin);<br><br>    CloseHandle(fh);<br>    return 0;<br>}<br><br></font></div></div></div></div>