/* INCLUDES *****************************************************************/
-/* File contains Vista Semantics */
-#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0600
-
#include <k32.h>
-
-#define NDEBUG
-#include "../include/debug.h"
-
+#include <wine/debug.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
+
+#define SYMLINK_FLAG_RELATIVE 1
+
+typedef struct _REPARSE_DATA_BUFFER {
+ ULONG ReparseTag;
+ USHORT ReparseDataLength;
+ USHORT Reserved;
+ union {
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ ULONG Flags;
+ WCHAR PathBuffer[1];
+ } SymbolicLinkReparseBuffer;
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ WCHAR PathBuffer[1];
+ } MountPointReparseBuffer;
+ struct {
+ UCHAR DataBuffer[1];
+ } GenericReparseBuffer;
+ };
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+
+#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
/* FUNCTIONS ****************************************************************/
/*
* @implemented
*/
-HANDLE STDCALL CreateFileA (LPCSTR lpFileName,
+HANDLE WINAPI CreateFileA (LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PWCHAR FileNameW;
HANDLE FileHandle;
- DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
+ TRACE("CreateFileA(lpFileName %s)\n",lpFileName);
if (!(FileNameW = FilenameA2W(lpFileName, FALSE)))
return INVALID_HANDLE_VALUE;
/*
* @implemented
*/
-HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
+HANDLE WINAPI CreateFileW (LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
HANDLE FileHandle;
NTSTATUS Status;
ULONG FileAttributes, Flags = 0;
- CSR_API_MESSAGE Request;
PVOID EaBuffer = NULL;
ULONG EaLength = 0;
- DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
+ TRACE("CreateFileW(lpFileName %S)\n",lpFileName);
/* validate & translate the creation disposition */
switch (dwCreationDisposition)
return (INVALID_HANDLE_VALUE);
}
+ /* check for console input/output */
+ if (0 == _wcsicmp(L"CONOUT$", lpFileName)
+ || 0 == _wcsicmp(L"CONIN$", lpFileName))
+ {
+ return OpenConsoleW(lpFileName,
+ dwDesiredAccess,
+ lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE);
+ }
+
/* validate & translate the flags */
/* translate the flags that need no validation */
if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
{
if(dwDesiredAccess & GENERIC_ALL)
- Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY;
+ Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_REMOTE_INSTANCE;
else
{
if(dwDesiredAccess & GENERIC_READ)
Flags |= FILE_OPEN_FOR_BACKUP_INTENT;
if(dwDesiredAccess & GENERIC_WRITE)
- Flags |= FILE_OPEN_FOR_RECOVERY;
+ Flags |= FILE_OPEN_REMOTE_INSTANCE;
}
}
else
/* FILE_FLAG_POSIX_SEMANTICS is handled later */
- /* check for console output */
- if (0 == _wcsicmp(L"CONOUT$", lpFileName))
- {
- /* FIXME: Send required access rights to Csrss */
- Status = CsrClientCallServer(&Request,
- 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 Request.Data.GetOutputHandleRequest.OutputHandle;
- }
- }
-
- /* check for console input */
- if (0 == _wcsicmp(L"CONIN$", lpFileName))
- {
- /* FIXME: Send required access rights to Csrss */
- Status = CsrClientCallServer(&Request,
- 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 Request.Data.GetInputHandleRequest.InputHandle;
- }
- }
-
/* validate & translate the filename */
if (!RtlDosPathNameToNtPathName_U (lpFileName,
&NtPathU,
NULL,
NULL))
{
- DPRINT("Invalid path\n");
+ WARN("Invalid path\n");
SetLastError(ERROR_PATH_NOT_FOUND);
return INVALID_HANDLE_VALUE;
}
- DPRINT("NtPathU \'%wZ\'\n", &NtPathU);
+ TRACE("NtPathU \'%wZ\'\n", &NtPathU);
if (hTemplateFile != NULL)
{
* @implemented
*/
BOOLEAN
-STDCALL
+WINAPI
CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
IN LPCWSTR lpTargetFileName,
IN DWORD dwFlags)
ULONG dwCreateOptions;
DWORD dwErr;
- if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMLINK_FLAG_DIRECTORY) != SYMLINK_FLAG_DIRECTORY)
+ if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMBOLIC_LINK_FLAG_DIRECTORY) != SYMBOLIC_LINK_FLAG_DIRECTORY)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
- if(dwFlags & SYMLINK_FLAG_DIRECTORY)
+ if(dwFlags & SYMBOLIC_LINK_FLAG_DIRECTORY)
dwCreateOptions = FILE_DIRECTORY_FILE;
else
dwCreateOptions = FILE_NON_DIRECTORY_FILE;
pBufTail = (PBYTE)(pReparseData->SymbolicLinkReparseBuffer.PathBuffer);
- pReparseData->ReparseTag = IO_REPARSE_TAG_SYMLINK;
- pReparseData->ReparseDataLength = cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
+ pReparseData->ReparseTag = (ULONG)IO_REPARSE_TAG_SYMLINK;
+ pReparseData->ReparseDataLength = (USHORT)cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
pReparseData->Reserved = 0;
pReparseData->SymbolicLinkReparseBuffer.SubstituteNameOffset = 0;
RtlCopyMemory(pBufTail, TargetFileName.Buffer, TargetFileName.Length);
pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset = pReparseData->SymbolicLinkReparseBuffer.SubstituteNameLength;
- pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = cbPrintName;
+ pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = (USHORT)cbPrintName;
pBufTail += pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset;
RtlCopyMemory(pBufTail, lpTargetFileName, cbPrintName);
* @implemented
*/
BOOLEAN
-STDCALL
+NTAPI
CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName,
IN LPCSTR lpTargetFileName,
IN DWORD dwFlags)
{
PWCHAR SymlinkW, TargetW;
- BOOL Ret;
+ BOOLEAN Ret;
if(!lpSymlinkFileName || !lpTargetFileName)
{