On 24 July 2010 16:10, Max TenEyck Woodbury max@mtew.isa-geek.net wrote:
On 07/24/2010 10:58 AM, Nikolay Sivov wrote:
On 7/24/2010 18:51, Max TenEyck Woodbury wrote:
dlls/ntdll/file.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 0a6ee55..86c200f 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -2148,6 +2148,11 @@ NTSTATUS WINAPI NtSetInformationFile(HANDLE handle, PIO_STATUS_BLOCK io, io->u.Status = STATUS_INVALID_PARAMETER_3; break;
- /* Invalid requests - do not need 'fixing'. */
- case FileAllInformation:
- io->u.Status = STATUS_NOT_IMPLEMENTED;
- break;
default: FIXME("Unsupported class (%d)\n", class); io->u.Status = STATUS_NOT_IMPLEMENTED;
Add a test please, and a comment won't be needed with a test too.
There already is a test in dlls/ntdll/test/file.c. It produces a 'fixme:' when it should not. This fixes that.
The only test I can find is:
1110 res = pNtSetInformationFile(h, &io, &fai_buf.fai, sizeof fai_buf, FileAllInformation); 1111 ok ( res == STATUS_INVALID_INFO_CLASS || res == STATUS_NOT_IMPLEMENTED, "shouldn't be able to set FileAllInformation, res %x\n", res);
I would say that (based on this test), STATUS_NOT_IMPLEMENTED is the wrong value to use -- it should really be STATUS_INVALID_INFO_CLASS. The check should mark the STATUS_NOT_IMPLEMENTED value as a broken value:
ok ( res == STATUS_INVALID_INFO_CLASS || broken(res == STATUS_NOT_IMPLEMENTED), "shouldn't be able to set FileAllInformation, res %x\n", res);
This would fix the return value for this condition.
In addition to this, the Wine implementation is returning io->u.Status in all these cases, but the tests for pNtSetInformationFile do not also check they are the same. To avoid false positives or negatives, io->u.Status needs to be set before each test. Thus, you have something like:
io.u.Status = 0xdeadbeef; res = pNtSetInformationFile(...); ok (res == STATUS_SUCCESS, "Expected NtSetInformationFile to return STATUS_SUCCESS, got %d\n", res); ok(res == U(io).Status, "Expected NtSetInformationFile return to match io.u.Status, got res = %d, io.u.Status = %d\n", res, U(io).Status);
or:
ok (res == STATUS_SUCCESS, "Expected NtSetInformationFile to return STATUS_SUCCESS, got %d\n", res); ok(U(io).Status == STATUS_SUCCESS, "Expected io.u.Status to be STATUS_SUCCESS, got %d\n", U(io).Status);
This way, the tests confirm that io.u.Status and the return value of NtSetInformationFile are the same.
- Reece