[NTOSKRNL] Reference the file object before issuing the unlock all IRP
[reactos.git] / dll / shellext / zipfldr / zippidl.cpp
1 /*
2 * PROJECT: ReactOS Zip Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: zip pidl handling
5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8 #include "precomp.h"
9
10 LPITEMIDLIST _ILCreate(ZipPidlType Type, LPCSTR lpString, unz_file_info64& info)
11 {
12 int cbData = sizeof(ZipPidlEntry) + strlen(lpString);
13 ZipPidlEntry* pidl = (ZipPidlEntry*)SHAlloc(cbData + sizeof(WORD));
14 if (!pidl)
15 return NULL;
16
17 ZeroMemory(pidl, cbData + sizeof(WORD));
18
19 pidl->cb = cbData;
20 pidl->MagicType = 'z';
21 pidl->ZipType = Type;
22
23 if (Type != ZIP_PIDL_DIRECTORY)
24 {
25 pidl->CompressedSize = info.compressed_size;
26 pidl->UncompressedSize = info.uncompressed_size;
27 pidl->DosDate = info.dosDate;
28 pidl->Password = info.flag & 1;
29 }
30
31 strcpy(pidl->Name, lpString);
32 *(WORD*)((char*)pidl + cbData) = 0;
33
34 return (LPITEMIDLIST)pidl;
35 }
36
37
38 const ZipPidlEntry* _ZipFromIL(LPCITEMIDLIST pidl)
39 {
40 const ZipPidlEntry* zipPidl = (const ZipPidlEntry*)pidl;
41 if (zipPidl->MagicType == 'z')
42 return zipPidl;
43 return NULL;
44 }