See inline...
Am 07.03.2014 20:33, schrieb [email protected]:
> [...]
> + /* 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
_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev