=?UTF-8?Q?Vincas=20Mili=C5=ABnas=20?=: kernel32: Added implementation for OpenFileById.
Alexandre Julliard
julliard at winehq.org
Fri Oct 12 11:37:45 CDT 2012
Module: wine
Branch: master
Commit: aba4619dfe3ed96a12c2df19e3ec30208671351d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=aba4619dfe3ed96a12c2df19e3ec30208671351d
Author: Vincas Miliūnas <vincas.miliunas at gmail.com>
Date: Fri Oct 12 13:35:37 2012 +0300
kernel32: Added implementation for OpenFileById.
---
dlls/kernel32/file.c | 51 +++++++++++++++++++++++++++++++++++++++++++
dlls/kernel32/kernel32.spec | 1 +
dlls/kernel32/tests/file.c | 2 -
3 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index cac1e98..41abe49 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -2601,6 +2601,57 @@ error: /* We get here if there was an error opening the file */
return HFILE_ERROR;
}
+
+/***********************************************************************
+ * OpenFileById (KERNEL32.@)
+ */
+HANDLE WINAPI OpenFileById( HANDLE handle, LPFILE_ID_DESCRIPTOR id, DWORD access,
+ DWORD share, LPSECURITY_ATTRIBUTES sec_attr, DWORD flags )
+{
+ UINT options;
+ HANDLE result;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ IO_STATUS_BLOCK io;
+ UNICODE_STRING objectName;
+
+ if (!id)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return INVALID_HANDLE_VALUE;
+ }
+
+ options = FILE_OPEN_BY_FILE_ID;
+ if (flags & FILE_FLAG_BACKUP_SEMANTICS)
+ options |= FILE_OPEN_FOR_BACKUP_INTENT;
+ else
+ options |= FILE_NON_DIRECTORY_FILE;
+ if (flags & FILE_FLAG_NO_BUFFERING) options |= FILE_NO_INTERMEDIATE_BUFFERING;
+ if (!(flags & FILE_FLAG_OVERLAPPED)) options |= FILE_SYNCHRONOUS_IO_NONALERT;
+ if (flags & FILE_FLAG_RANDOM_ACCESS) options |= FILE_RANDOM_ACCESS;
+ flags &= FILE_ATTRIBUTE_VALID_FLAGS;
+
+ objectName.Length = sizeof(ULONGLONG);
+ objectName.Buffer = (WCHAR *)&id->u.FileId;
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = handle;
+ attr.Attributes = 0;
+ attr.ObjectName = &objectName;
+ attr.SecurityDescriptor = sec_attr ? sec_attr->lpSecurityDescriptor : NULL;
+ attr.SecurityQualityOfService = NULL;
+ if (sec_attr && sec_attr->bInheritHandle) attr.Attributes |= OBJ_INHERIT;
+
+ status = NtCreateFile( &result, access, &attr, &io, NULL, flags,
+ share, OPEN_EXISTING, options, NULL, 0 );
+ if (status != STATUS_SUCCESS)
+ {
+ SetLastError( RtlNtStatusToDosError( status ) );
+ return INVALID_HANDLE_VALUE;
+ }
+ return result;
+}
+
+
/***********************************************************************
* K32EnumDeviceDrivers (KERNEL32.@)
*/
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 57f7aff..b7efa0f 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -886,6 +886,7 @@
@ stdcall OpenEventA(long long str)
@ stdcall OpenEventW(long long wstr)
@ stdcall OpenFile(str ptr long)
+@ stdcall OpenFileById(long ptr long long ptr long)
@ stdcall OpenFileMappingA(long long str)
@ stdcall OpenFileMappingW(long long wstr)
@ stdcall OpenJobObjectA(long long str)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 6cc79c0..11e0044 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -3419,7 +3419,6 @@ static void test_OpenFileById(void)
SetLastError(0xdeadbeef);
handle = pOpenFileById(directory, NULL, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 0);
- todo_wine
ok(handle == INVALID_HANDLE_VALUE && GetLastError() == ERROR_INVALID_PARAMETER,
"OpenFileById: expected ERROR_INVALID_PARAMETER, got error %u.\n", GetLastError());
@@ -3427,7 +3426,6 @@ static void test_OpenFileById(void)
fileIdDescr.Type = FileIdType;
U(fileIdDescr).FileId = bothDirInfo->FileId;
handle = pOpenFileById(directory, &fileIdDescr, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 0);
- todo_wine
ok(handle != INVALID_HANDLE_VALUE, "OpenFileById: failed to open the file, got error %u.\n", GetLastError());
ret = ReadFile(handle, buffer, sizeof(buffer), &count, NULL);
More information about the wine-cvs
mailing list