- DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Proto...
[reactos.git] / reactos / lib / recyclebin / recyclebin_v5_enumerator.c
index e8da416..37413f3 100644 (file)
@@ -57,6 +57,16 @@ RecycleBin5File_RecycleBinFile_AddRef(
        return refCount;
 }
 
+static VOID
+RecycleBin5File_Destructor(
+       struct RecycleBin5File *s)
+{
+       TRACE("(%p)\n", s);
+
+       IRecycleBin5_Release(s->recycleBin);
+       CoTaskMemFree(s);
+}
+
 static ULONG STDMETHODCALLTYPE
 RecycleBin5File_RecycleBinFile_Release(
        IN IRecycleBinFile *This)
@@ -69,10 +79,7 @@ RecycleBin5File_RecycleBinFile_Release(
        refCount = InterlockedDecrement((PLONG)&s->ref);
 
        if (refCount == 0)
-       {
-               IRecycleBin5_Release(s->recycleBin);
-               CoTaskMemFree(s);
-       }
+               RecycleBin5File_Destructor(s);
 
        return refCount;
 }
@@ -184,9 +191,9 @@ RecycleBin5File_RecycleBinFile_GetAttributes(
 static HRESULT STDMETHODCALLTYPE
 RecycleBin5File_RecycleBinFile_GetFileName(
        IN IRecycleBinFile *This,
-       IN DWORD BufferSize,
+       IN SIZE_T BufferSize,
        IN OUT LPWSTR Buffer,
-       OUT DWORD *RequiredSize)
+       OUT SIZE_T *RequiredSize)
 {
        struct RecycleBin5File *s = CONTAINING_RECORD(This, struct RecycleBin5File, recycleBinFileImpl);
        DWORD dwRequired;
@@ -240,7 +247,7 @@ CONST_VTBL struct IRecycleBinFileVtbl RecycleBin5FileVtbl =
 };
 
 static HRESULT
-RecycleBin5_File_Constructor(
+RecycleBin5File_Constructor(
        IN IRecycleBin5 *prb,
        IN LPCWSTR Folder,
        IN PDELETED_FILE_RECORD pDeletedFile,
@@ -272,6 +279,11 @@ RecycleBin5_File_Constructor(
        IRecycleBin5_AddRef(s->recycleBin);
        *ppFile = &s->recycleBinFileImpl;
        wsprintfW(s->FullName, L"%s\\D%c%lu%s", Folder, pDeletedFile->dwDriveNumber + 'a', pDeletedFile->dwRecordUniqueId, Extension);
+       if (GetFileAttributesW(s->FullName) == INVALID_FILE_ATTRIBUTES)
+       {
+               RecycleBin5File_Destructor(s);
+               return E_FAIL;
+       }
 
        return S_OK;
 }
@@ -324,6 +336,18 @@ RecycleBin5Enum_RecycleBinEnumList_AddRef(
        return refCount;
 }
 
+static VOID
+RecycleBin5Enum_Destructor(
+       struct RecycleBin5Enum *s)
+{
+       TRACE("(%p)\n", s);
+
+       IRecycleBin5_OnClosing(s->recycleBin, &s->recycleBinEnumImpl);
+       UnmapViewOfFile(s->pInfo);
+       IRecycleBin5_Release(s->recycleBin);
+       CoTaskMemFree(s);
+}
+
 static ULONG STDMETHODCALLTYPE
 RecycleBin5Enum_RecycleBinEnumList_Release(
        IN IRecycleBinEnumList *This)
@@ -336,12 +360,7 @@ RecycleBin5Enum_RecycleBinEnumList_Release(
        refCount = InterlockedDecrement((PLONG)&s->ref);
 
        if (refCount == 0)
-       {
-               IRecycleBin5_OnClosing(s->recycleBin, This);
-               UnmapViewOfFile(s->pInfo);
-               IRecycleBin5_Release(s->recycleBin);
-               CoTaskMemFree(s);
-       }
+               RecycleBin5Enum_Destructor(s);
 
        return refCount;
 }
@@ -377,15 +396,10 @@ RecycleBin5Enum_RecycleBinEnumList_Next(
        pDeletedFile = (DELETED_FILE_RECORD *)(pHeader + 1) + i;
        for (; i < dwEntries && fetched < celt; i++)
        {
-               hr = RecycleBin5_File_Constructor(s->recycleBin, s->szPrefix, pDeletedFile, &rgelt[fetched]);
-               if (!SUCCEEDED(hr))
-               {
-                       for (i = 0; i < fetched; i++)
-                               IRecycleBinFile_Release(rgelt[i]);
-                       return hr;
-               }
+               hr = RecycleBin5File_Constructor(s->recycleBin, s->szPrefix, pDeletedFile, &rgelt[fetched]);
+               if (SUCCEEDED(hr))
+                       fetched++;
                pDeletedFile++;
-               fetched++;
        }
 
        s->dwCurrent = i;
@@ -429,7 +443,7 @@ CONST_VTBL struct IRecycleBinEnumListVtbl RecycleBin5EnumVtbl =
 };
 
 HRESULT
-RecycleBin5_Enumerator_Constructor(
+RecycleBin5Enum_Constructor(
        IN IRecycleBin5 *prb,
        IN HANDLE hInfo,
        IN HANDLE hInfoMapped,