Пожалуйста, обратите внимание, что пользователь заблокирован
C:
int create_link( LPCWSTR lpExistingFileName, LPCWSTR lpLinkName )
{
NTSTATUS status;
UNICODE_STRING OldFileName;
UNICODE_STRING NewFileName;
OBJECT_ATTRIBUTES OldObject;
OBJECT_ATTRIBUTES NewObject;
IO_STATUS_BLOCK OldIoStatusBlock;
PFILE_LINK_INFORMATION NewName;
HANDLE OldFileHandle, NewFileHandle = INVALID_HANDLE_VALUE;
OldFileName.Buffer = NULL;
NewFileName.Buffer = NULL;
NTLIB32.RtlInitUnicodeString( &OldFileName, lpExistingFileName );
InitializeObjectAttributes(
&OldObject,
&OldFileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
status = NTLIB32.NtOpenFile(
&OldFileHandle,
FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
&OldObject,
&OldIoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_FLAG_OPEN_REPARSE_POINT | FILE_SYNCHRONOUS_IO_NONALERT
);
NTLIB32.RtlInitUnicodeString( &NewFileName, lpLinkName );
InitializeObjectAttributes(
&NewObject,
&NewFileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
NewName = ( PFILE_LINK_INFORMATION ) malloc ( NewFileName.Length + sizeof( *NewName ) );
memmove( NewName->FileName, NewFileName.Buffer, NewFileName.Length );
NewName->ReplaceIfExists = FALSE;
NewName->RootDirectory = NULL;
NewName->FileNameLength = NewFileName.Length;
status = NTLIB32.NtSetInformationFile(
OldFileHandle,
&OldIoStatusBlock,
NewName,
NewFileName.Length + sizeof( *NewName ),
11
);
switch ( status )
{
case 00000000:
{
if ( OldFileHandle != INVALID_HANDLE_VALUE )
{
if ( NTLIB32.NtClose( OldFileHandle ) == 00000000 )
{
return 0;
}
}
}
}
return -1;
}