{
PWCHAR FileNameW;
HANDLE FileHandle;
-
+
DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
-
+
if (!(FileNameW = FilenameA2W(lpFileName, FALSE)))
return INVALID_HANDLE_VALUE;
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
-
+
return FileHandle;
}
HANDLE FileHandle;
NTSTATUS Status;
ULONG FileAttributes, Flags = 0;
- CSRSS_API_REQUEST Request;
- CSRSS_API_REPLY Reply;
+ CSR_API_MESSAGE Request;
PVOID EaBuffer = NULL;
ULONG EaLength = 0;
case CREATE_NEW:
dwCreationDisposition = FILE_CREATE;
break;
-
+
case CREATE_ALWAYS:
dwCreationDisposition = FILE_OVERWRITE_IF;
break;
-
+
case OPEN_EXISTING:
dwCreationDisposition = FILE_OPEN;
break;
-
+
case OPEN_ALWAYS:
dwCreationDisposition = FILE_OPEN_IF;
break;
case TRUNCATE_EXISTING:
dwCreationDisposition = FILE_OVERWRITE;
break;
-
+
default:
SetLastError(ERROR_INVALID_PARAMETER);
return (INVALID_HANDLE_VALUE);
SetLastError(ERROR_PATH_NOT_FOUND);
return INVALID_HANDLE_VALUE;
}
-
+
DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
/* validate & translate the flags */
while waiting for file io to complete */
Flags |= FILE_SYNCHRONOUS_IO_NONALERT;
}
-
+
if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH)
Flags |= FILE_WRITE_THROUGH;
if(dwFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS)
Flags |= FILE_RANDOM_ACCESS;
-
+
if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN)
Flags |= FILE_SEQUENTIAL_ONLY;
-
+
if(dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE)
Flags |= FILE_DELETE_ON_CLOSE;
-
+
if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
{
if(dwDesiredAccess & GENERIC_ALL)
Flags |= FILE_OPEN_NO_RECALL;
FileAttributes = (dwFlagsAndAttributes & (FILE_ATTRIBUTE_VALID_FLAGS & ~FILE_ATTRIBUTE_DIRECTORY));
-
+
/* handle may allways be waited on and querying attributes are allways allowed */
dwDesiredAccess |= SYNCHRONIZE | FILE_READ_ATTRIBUTES;
if (0 == _wcsicmp(L"CONOUT$", lpFileName))
{
/* FIXME: Send required access rights to Csrss */
- Request.Type = CSRSS_GET_OUTPUT_HANDLE;
Status = CsrClientCallServer(&Request,
- &Reply,
- sizeof(CSRSS_API_REQUEST),
- sizeof(CSRSS_API_REPLY));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
+ NULL,
+ MAKE_CSR_API(GET_OUTPUT_HANDLE, CSR_NATIVE),
+ sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
SetLastErrorByStatus(Status);
return INVALID_HANDLE_VALUE;
}
else
{
- return Reply.Data.GetOutputHandleReply.OutputHandle;
+ return Request.Data.GetOutputHandleRequest.OutputHandle;
}
}
if (0 == _wcsicmp(L"CONIN$", lpFileName))
{
/* FIXME: Send required access rights to Csrss */
- Request.Type = CSRSS_GET_INPUT_HANDLE;
Status = CsrClientCallServer(&Request,
- &Reply,
- sizeof(CSRSS_API_REQUEST),
- sizeof(CSRSS_API_REPLY));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
+ NULL,
+ MAKE_CSR_API(GET_INPUT_HANDLE, CSR_NATIVE),
+ sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
SetLastErrorByStatus(Status);
return INVALID_HANDLE_VALUE;
}
else
{
- return Reply.Data.GetInputHandleReply.InputHandle;
+ return Request.Data.GetInputHandleRequest.InputHandle;
}
}
-
+
if (hTemplateFile != NULL)
{
FILE_EA_INFORMATION EaInformation;
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return INVALID_HANDLE_VALUE;
}
-
+
Status = NtQueryEaFile(hTemplateFile,
&IoStatusBlock,
EaBuffer,
0,
NULL,
TRUE);
-
+
if (NT_SUCCESS(Status))
{
/* we successfully read the extended attributes, break the loop
0,
EaBuffer);
EaBuffer = NULL;
-
+
if (Status != STATUS_BUFFER_TOO_SMALL)
{
/* unless we just allocated not enough memory, break the loop
ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
}
-
+
if(!(dwFlagsAndAttributes & FILE_FLAG_POSIX_SEMANTICS))
ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
EaLength);
RtlFreeUnicodeString(&NtPathU);
-
+
/* free the extended attributes buffer if allocated */
if (EaBuffer != NULL)
{
{
SetLastErrorByStatus (Status);
}
-
+
return INVALID_HANDLE_VALUE;
}
-
+
/*
create with OPEN_ALWAYS (FILE_OPEN_IF) returns info = FILE_OPENED or FILE_CREATED
create with CREATE_ALWAYS (FILE_OVERWRITE_IF) returns info = FILE_OVERWRITTEN or FILE_CREATED
- */
+ */
if (dwCreationDisposition == FILE_OPEN_IF)
{
SetLastError(IoStatusBlock.Information == FILE_OPENED ? ERROR_ALREADY_EXISTS : 0);
return FileHandle;
}
+
+/*
+ * @unimplemented
+ */
+BOOL STDCALL
+CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
+ IN LPCWSTR lpTargetFileName,
+ IN DWORD dwFlags)
+{
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL STDCALL
+CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName,
+ IN LPCSTR lpTargetFileName,
+ IN DWORD dwFlags)
+{
+ PWCHAR SymlinkW, TargetW;
+ BOOL Ret;
+
+ if(!lpSymlinkFileName || !lpTargetFileName)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ if (!(SymlinkW = FilenameA2W(lpSymlinkFileName, FALSE)))
+ return FALSE;
+
+ if (!(TargetW = FilenameA2W(lpTargetFileName, TRUE)))
+ return FALSE;
+
+ Ret = CreateSymbolicLinkW(SymlinkW,
+ TargetW,
+ dwFlags);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, TargetW);
+
+ return Ret;
+}
+
+
/* EOF */