See inline... Am 07.03.2014 20:33, schrieb pschweit...@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 _______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev