On 2013-09-18 11:31, Dmitry Timoshkov wrote:
Thomas Faber thfabba@gmx.de wrote:
status = pNtWriteFile(hfile, 0, NULL, NULL, &iob, contents, sizeof(contents), &offset, NULL); ok(status == STATUS_PENDING || broken(status == STATUS_SUCCESS) /* see below */, "expected STATUS_PENDING, got %#x\n", status); ok(iob.Status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#x\n", iob.Status); ok(iob.Information == sizeof(contents), "expected sizeof(contents), got %lu\n", iob.Information); ... ret = WaitForSingleObject(hfile, 3000);
Technically, the IO_STATUS_BLOCK (hence also the OVERLAPPED) structure is only filled once the I/O Manager completes the read/write IRP -- meaning its contents should only be read _after_ the wait.
Contents of IO_STATUS_BLOCK/OVERLAPPED are tested only in the cases known to not contain STATUS_PENDING of a being executed operation, which means that the operation has already finished and waiting would return immediately and therefore is not necessary and redundant.
Hmm maybe I'm misunderstanding what you're saying, sorry... but I thought the snippet above was a counter-example. It's a pretty straightforward write that's expected to succeed (asynchronously), and it verifies that STATUS_PENDING is returned, but then immediately reads iob.
It's from line 2213ff. The ones at 2364 and 2381 look similar, there might be more.
Am I missing some aspect of the test that makes it different from "simple async write should always return pending"?
Thanks, Thomas