See inline...
Am 07.03.2014 20:33, schrieb pschweitzer@svn.reactos.org:
[...]
- /* Update user buffer with the change that occured
* First copy parent name if any* Then copy target name, there's always one* And finally, copy stream name if any* If these names aren't unicode, then convert first*/- _SEH2_TRY
- {
OutputBuffer->NextEntryOffset = 0;OutputBuffer->Action = Action;OutputBuffer->FileNameLength = DataLength - sizeof(FILE_NOTIFY_INFORMATION);if (IsUnicode){if (ParentName->Length){RtlCopyMemory(OutputBuffer->FileName, ParentName->Buffer, ParentName->Length);OutputBuffer->FileName[ParentName->Length / sizeof(WCHAR)] = L'\\';AlreadyWritten = ParentName->Length + sizeof(WCHAR);}RtlCopyMemory(OutputBuffer->FileName + AlreadyWritten, TargetName->Buffer, TargetName->Length);
OutputBuffer->FileName is a WCHAR array, AlreadyWritten is a count of bytes, the pointer arithmetic is wrong here.
if (StreamName){AlreadyWritten += TargetName->Length;OutputBuffer->FileName[AlreadyWritten / sizeof(WCHAR)] = L':';RtlCopyMemory(OutputBuffer->FileName + AlreadyWritten + sizeof(WCHAR),StreamName->Buffer, StreamName->Length);
see above
}}else{if (!ParentName->Length){ASSERT(StreamName);RtlCopyMemory(OutputBuffer->FileName, StreamName->Buffer, StreamName->Length);}else{RtlOemToUnicodeN(OutputBuffer->FileName, OutputBuffer->FileNameLength,&ResultSize, ParentName->Buffer,ParentName->Length);OutputBuffer->FileName[ResultSize / sizeof(WCHAR)] = L'\\';AlreadyWritten = ResultSize + sizeof(WCHAR);RtlOemToUnicodeN(OutputBuffer->FileName + AlreadyWritten,OutputBuffer->FileNameLength, &ResultSize,TargetName->Buffer, TargetName->Length);
see above
if (StreamName){AlreadyWritten += ResultSize;OutputBuffer->FileName[AlreadyWritten / sizeof(WCHAR)] = L':';RtlOemToUnicodeN(OutputBuffer->FileName + AlreadyWritten + sizeof(WCHAR),OutputBuffer->FileNameLength, &ResultSize,StreamName->Buffer, StreamName->Length);
see above
[...]
/* Look for target name & construct it, if required */if (TargetName.Buffer){TargetNameLength = TargetName.Length;
The TargetNameLength vatiable is completely redundant
[...]
/* Get the position where we can put our data (aligned!) */AlignedDataLength = ROUND_UP(NotifyChange->DataLength, sizeof(ULONG));/* If it's higher than buffer length, then, bail out without outputing */if (DataLength > NumberOfBytes || AlignedDataLength + DataLength > NumberOfBytes){NotifyChange->Flags |= NOTIFY_IMMEDIATELY;}else{OutputBuffer = 0;FileNotifyInfo = 0;
Use NULL