Vibhav Pant (@vibhavp) commented about dlls/opcservices/compress.c:
struct zip64_end_of_central_directory eocd64;
uint64_t eocd64_offset = archive->position;
struct zip64_extra_field extra_field;
for (i = 0; i < archive->file_count; ++i)
{
const struct zip_file *file = archive->files[i];
cdh.signature = ZIP32_CDFH;
cdh.version = ZIP64_VERSION;
cdh.min_version = ZIP64_VERSION;
cdh.flags = USE_DATA_DESCRIPTOR;
cdh.method = 8; /* Z_DEFLATED */
cdh.mtime = archive->mtime;
cdh.crc32 = file->crc32;
cdh.compressed_size = ~0u;
The spec is a little unclear about when the central directory fields can be ~0:
4.4.1.4 If one of the fields in the end of central directory record is too small to hold required data, the field SHOULD be set to -1 (0xFFFF or 0xFFFFFFFF) and the ZIP64 format record SHOULD be created.
However, I couldn't find anything saying that the fields can be ~0 even when the value can fit inside a 32-bit integer (the data descriptor records are explicitly allowed to do this in 4.3.9.2). It should be fine, though.