kernelbase: Use NtCreateFile for console handles in CreateFileW.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d2a3104f5f
commit
0556d9e6f1
|
@ -1308,7 +1308,6 @@ static void test_CreateFileW(void)
|
|||
cf_table[index].creation, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (!index && ret == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
todo_wine
|
||||
win_skip("Skipping NT path tests, not supported on this Windows version\n");
|
||||
skip_nt = TRUE;
|
||||
continue;
|
||||
|
@ -3208,25 +3207,21 @@ static void test_FreeConsole(void)
|
|||
ok(ret, "FreeConsole failed: %u\n", GetLastError());
|
||||
|
||||
handle = CreateFileA("CONOUT$", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||
todo_wine
|
||||
ok(handle == INVALID_HANDLE_VALUE &&
|
||||
(GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)),
|
||||
"CreateFileA failed: %u\n", GetLastError());
|
||||
|
||||
handle = CreateFileA("CONIN$", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||
todo_wine
|
||||
ok(handle == INVALID_HANDLE_VALUE &&
|
||||
(GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)),
|
||||
"CreateFileA failed: %u\n", GetLastError());
|
||||
|
||||
handle = CreateFileA("CON", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||
todo_wine
|
||||
ok(handle == INVALID_HANDLE_VALUE &&
|
||||
(GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)),
|
||||
"CreateFileA failed: %u\n", GetLastError());
|
||||
|
||||
handle = CreateFileA("CON", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||
todo_wine
|
||||
ok(handle == INVALID_HANDLE_VALUE &&
|
||||
(GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_FILE_NOT_FOUND /* winxp */)),
|
||||
"CreateFileA failed: %u\n", GetLastError());
|
||||
|
|
|
@ -172,32 +172,6 @@ static COORD get_largest_console_window_size( HANDLE handle )
|
|||
return c;
|
||||
}
|
||||
|
||||
/* helper function to replace OpenConsoleW */
|
||||
HANDLE open_console( BOOL output, DWORD access, SECURITY_ATTRIBUTES *sa, DWORD creation )
|
||||
{
|
||||
HANDLE ret;
|
||||
|
||||
if (creation != OPEN_EXISTING)
|
||||
{
|
||||
SetLastError( ERROR_INVALID_PARAMETER );
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
SERVER_START_REQ( open_console )
|
||||
{
|
||||
req->from = wine_server_obj_handle( ULongToHandle( output ));
|
||||
req->access = access;
|
||||
req->attributes = sa && sa->bInheritHandle ? OBJ_INHERIT : 0;
|
||||
req->share = FILE_SHARE_READ | FILE_SHARE_WRITE;
|
||||
wine_server_call_err( req );
|
||||
ret = wine_server_ptr_handle( reply->handle );
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
if (ret) ret = console_handle_map( ret );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************
|
||||
* AttachConsole (kernelbase.@)
|
||||
*/
|
||||
|
|
|
@ -744,13 +744,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
|||
(sharing & FILE_SHARE_DELETE) ? "FILE_SHARE_DELETE " : "",
|
||||
creation, attributes);
|
||||
|
||||
/* Open a console for CONIN$ or CONOUT$ */
|
||||
|
||||
if (!wcsicmp( filename, L"CONIN$" ))
|
||||
return open_console( FALSE, access, sa, creation ? OPEN_EXISTING : 0 );
|
||||
if (!wcsicmp( filename, L"CONOUT$" ))
|
||||
return open_console( TRUE, access, sa, creation ? OPEN_EXISTING : 0 );
|
||||
|
||||
if (!wcsncmp( filename, L"\\\\.\\", 4 ))
|
||||
{
|
||||
if ((filename[4] && filename[5] == ':' && !filename[6]) ||
|
||||
|
@ -771,24 +764,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
|||
}
|
||||
else dosdev = RtlIsDosDeviceName_U( filename );
|
||||
|
||||
if (dosdev)
|
||||
{
|
||||
if (LOWORD(dosdev) == 3 * sizeof(WCHAR) &&
|
||||
!wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CON", 3 ))
|
||||
{
|
||||
switch (access & (GENERIC_READ|GENERIC_WRITE))
|
||||
{
|
||||
case GENERIC_READ:
|
||||
return open_console( FALSE, access, sa, OPEN_EXISTING );
|
||||
case GENERIC_WRITE:
|
||||
return open_console( TRUE, access, sa, OPEN_EXISTING );
|
||||
default:
|
||||
SetLastError( ERROR_FILE_NOT_FOUND );
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (creation < CREATE_NEW || creation > TRUNCATE_EXISTING)
|
||||
{
|
||||
SetLastError( ERROR_INVALID_PARAMETER );
|
||||
|
@ -853,6 +828,12 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
|||
}
|
||||
else
|
||||
{
|
||||
if (dosdev &&
|
||||
((LOWORD(dosdev) == 3 * sizeof(WCHAR) && !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CON", 3 )) ||
|
||||
(LOWORD(dosdev) == 6 * sizeof(WCHAR) && !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CONIN$", 6 )) ||
|
||||
(LOWORD(dosdev) == 7 * sizeof(WCHAR) && !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CONOUT$", 7 ))))
|
||||
ret = console_handle_map( ret );
|
||||
|
||||
if ((creation == CREATE_ALWAYS && io.Information == FILE_OVERWRITTEN) ||
|
||||
(creation == OPEN_ALWAYS && io.Information == FILE_OPENED))
|
||||
SetLastError( ERROR_ALREADY_EXISTS );
|
||||
|
|
|
@ -35,8 +35,6 @@ extern const WCHAR system_dir[] DECLSPEC_HIDDEN;
|
|||
static const BOOL is_win64 = (sizeof(void *) > sizeof(int));
|
||||
extern BOOL is_wow64 DECLSPEC_HIDDEN;
|
||||
|
||||
extern HANDLE open_console( BOOL output, DWORD access, SECURITY_ATTRIBUTES *sa, DWORD creation ) DECLSPEC_HIDDEN;
|
||||
|
||||
static inline BOOL is_console_handle(HANDLE h)
|
||||
{
|
||||
return h != INVALID_HANDLE_VALUE && ((UINT_PTR)h & 3) == 3;
|
||||
|
|
Loading…
Reference in New Issue