⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32.c

📁 压缩解压,是unzip540的升级,这个外国网站摘来的源码,是evb编写.
💻 C
📖 第 1 页 / 共 5 页
字号:
        switch (eb_id)        {            /* process security descriptor extra data if:                 Caller is WinNT AND                 Target local/remote drive supports acls AND                 Target file is not a directory (else we defer processing                   until later)             */            case EF_NTSD:                if (!IsWinNT())                    break; /* OS not capable of handling NTFS attributes */                if (eb_len < EB_NTSD_L_LEN)                    break; /* not a valid NTSD extra field */                /* check if we know how to handle this version */                if (*(ef_ptr + (EB_HEADSIZE+EB_NTSD_VERSION))                    > (uch)EB_NTSD_MAX_VER)                    break;                *p_ebSD_ptr = ef_ptr;                *p_ebSD_len = eb_len;                rc = TRUE;                break;#ifdef DEBUG            case EF_OS2:            case EF_AV:            case EF_PKVMS:            case EF_PKW32:            case EF_PKUNIX:            case EF_IZVMS:            case EF_IZUNIX:            case EF_IZUNIX2:            case EF_TIME:            case EF_MAC3:            case EF_JLMAC:            case EF_ZIPIT:            case EF_VMCMS:            case EF_MVS:            case EF_ACL:            case EF_ATHEOS:            case EF_BEOS:            case EF_QDOS:            case EF_AOSVS:            case EF_SPARK:            case EF_MD5:            case EF_ASIUNIX:                break;          /* shut up for other known e.f. blocks  */#endif /* DEBUG */            default:                Trace((stderr,                  "FindSDExtraField: unknown extra field block, ID=%u\n",                  eb_id));                break;        }        ef_ptr += (eb_len + EB_HEADSIZE);        ef_len -= (eb_len + EB_HEADSIZE);    }    return rc;}#ifndef SFX/**************************//*  Function test_NTSD()  */   /*  returns PK_WARN when NTSD data is invalid *//**************************/#ifdef __BORLANDC__/* Turn off warning about not using all parameters for this function only */#pragma argsused#endifint test_NTSD(__G__ eb, eb_size, eb_ucptr, eb_ucsize)    __GDEF    uch *eb;    unsigned eb_size;    uch *eb_ucptr;    ulg eb_ucsize;{    return (ValidateSecurity(eb_ucptr) ? PK_OK : PK_WARN);} /* end function test_NTSD() */#endif /* !SFX */#endif /* NTSD_EAS *//**********************//* Function IsWinNT() *//**********************/int IsWinNT(void)       /* returns TRUE if real NT, FALSE if Win9x or Win32s */{    static DWORD g_PlatformId = 0xFFFFFFFF; /* saved platform indicator */    if (g_PlatformId == 0xFFFFFFFF) {        /* note: GetVersionEx() doesn't exist on WinNT 3.1 */        if (GetVersion() < 0x80000000)            g_PlatformId = TRUE;        else            g_PlatformId = FALSE;    }    return (int)g_PlatformId;}/* DEBUG_TIME insertion: */#ifdef DEBUG_TIMEstatic int show_NTFileTime(FILE *hdo, char *TTmsg, int isloc, FILETIME *pft);static int show_NTFileTime(FILE *hdo, char *TTmsg, int isloc, FILETIME *pft){    SYSTEMTIME w32tm;    int rval;    rval = FileTimeToSystemTime(pft, &w32tm);    if (!rval) {        fprintf(hdo, "%s\n %08lX,%08lX (%s) -> Conversion failed !!!\n",                TTmsg, (ulg)(pft->dwHighDateTime), (ulg)(pft->dwLowDateTime),                (isloc ? "local" : "UTC"));    } else {        fprintf(hdo, "%s\n %08lx,%08lx -> %04u-%02u-%02u, %02u:%02u:%02u %s\n",                TTmsg, (ulg)(pft->dwHighDateTime), (ulg)(pft->dwLowDateTime),                w32tm.wYear, w32tm.wMonth, w32tm.wDay, w32tm.wHour,                w32tm.wMinute, w32tm.wSecond, (isloc ? "local" : "UTC"));    }    return rval;}#define FTTrace(x)   show_NTFileTime x#else#define FTTrace(x)#endif /* DEBUG_TIME *//* end of DEBUG_TIME insertion */#ifndef IZ_USE_INT64#  if (defined(__GNUC__) || defined(ULONG_LONG_MAX))     typedef long long            LLONG64;     typedef unsigned long long   ULLNG64;#    define IZ_USE_INT64#  elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100))     typedef __int64              LLONG64;     typedef unsigned __int64     ULLNG64;#    define IZ_USE_INT64#  elif (defined(_MSC_VER) && (_MSC_VER >= 1100))     typedef __int64              LLONG64;     typedef unsigned __int64     ULLNG64;#    define IZ_USE_INT64#  elif (defined(__IBMC__) && (__IBMC__ >= 350))     typedef __int64              LLONG64;     typedef unsigned __int64     ULLNG64;#    define IZ_USE_INT64#  elif defined(HAVE_INT64)     typedef __int64              LLONG64;     typedef unsigned __int64     ULLNG64;#    define IZ_USE_INT64#  endif#endif/* scale factor and offset for conversion time_t -> FILETIME */#define NT_QUANTA_PER_UNIX 10000000L#define UNIX_TIME_ZERO_HI  0x019DB1DEUL#define UNIX_TIME_ZERO_LO  0xD53E8000UL/* special FILETIME values for bound-checks */#define UNIX_TIME_UMAX_HI  0x0236485EUL#define UNIX_TIME_UMAX_LO  0xD4A5E980UL#define UNIX_TIME_SMIN_HI  0x0151669EUL#define UNIX_TIME_SMIN_LO  0xD53E8000UL#define UNIX_TIME_SMAX_HI  0x01E9FD1EUL#define UNIX_TIME_SMAX_LO  0xD4A5E980UL#define DOSTIME_MIN_FT_HI  0x01A8E79FUL#define DOSTIME_MIN_FT_LO  0xE1D58000UL/* time_t equivalent of DOSTIME_MINIMUM */#define UTIME_1980_JAN_01_00_00   315532800L#ifndef NO_W32TIMES_IZFIX/*********************************//* Function utime2NtfsFileTime() */ /* convert Unix time_t format into the *//*********************************/ /* form used by SetFileTime() in NT/9x */static void utime2NtfsFileTime(time_t ut, FILETIME *pft){#ifdef IZ_USE_INT64    ULLNG64 NTtime;    /* NT_QUANTA_PER_UNIX is small enough so that "ut * NT_QUANTA_PER_UNIX"     * cannot overflow in 64-bit signed calculation, regardless whether "ut"     * is signed or unsigned.  */    NTtime = ((LLONG64)ut * NT_QUANTA_PER_UNIX) +             ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32));    pft->dwLowDateTime = (DWORD)NTtime;    pft->dwHighDateTime = (DWORD)(NTtime >> 32);#else /* !IZ_USE_INT64 (64-bit integer arithmetics may not be supported) */    unsigned int b1, b2, carry = 0;    unsigned long r0, r1, r2, r3;    long r4;            /* signed, to catch environments with signed time_t */    b1 = ut & 0xFFFF;    b2 = (ut >> 16) & 0xFFFF;       /* if ut is over 32 bits, too bad */    r1 = b1 * (NT_QUANTA_PER_UNIX & 0xFFFF);    r2 = b1 * (NT_QUANTA_PER_UNIX >> 16);    r3 = b2 * (NT_QUANTA_PER_UNIX & 0xFFFF);    r4 = b2 * (NT_QUANTA_PER_UNIX >> 16);    r0 = (r1 + (r2 << 16)) & 0xFFFFFFFFL;    if (r0 < r1)        carry++;    r1 = r0;    r0 = (r0 + (r3 << 16)) & 0xFFFFFFFFL;    if (r0 < r1)        carry++;    pft->dwLowDateTime = r0 + UNIX_TIME_ZERO_LO;    if (pft->dwLowDateTime < r0)        carry++;    pft->dwHighDateTime = r4 + (r2 >> 16) + (r3 >> 16)                            + UNIX_TIME_ZERO_HI + carry;#endif /* ?IZ_USE_INT64 */} /* end function utime2NtfsFileTime() */#endif /* !NO_W32TIMES_IZFIX *//*********************************//* Function utime2VFatFileTime() */ /* convert Unix time_t format into the *//*********************************/ /* form used by SetFileTime() in NT/9x */static void utime2VFatFileTime(time_t ut, FILETIME *pft, int clipDosMin){    time_t utc = ut;    struct tm *ltm;    SYSTEMTIME w32tm;    FILETIME lft;#ifdef __BORLANDC__   /* Borland C++ 5.x crashes when trying to reference tm */    if (utc < UTIME_1980_JAN_01_00_00)        utc = UTIME_1980_JAN_01_00_00;#endif    ltm = localtime(&utc);    if (ltm == (struct tm *)NULL)        /* localtime() did not accept given utc time value; try to use           the UTC value */        ltm = gmtime(&utc);    if (ltm == (struct tm *)NULL) {        if (ut <= (UTIME_1980_JAN_01_00_00 + 86400)) {            /* use DOSTIME_MINIMUM date instead of "early" failure dates */            w32tm.wYear = 1980;            w32tm.wMonth = 1;            w32tm.wDay = 1;            w32tm.wHour = 0;            w32tm.wMinute = 0;            w32tm.wSecond = 0;        } else {            /* as a last resort, use the current system time */            GetLocalTime(&w32tm);        }    } else if (clipDosMin && (ltm->tm_year < 80)) {        w32tm.wYear = 1980;        w32tm.wMonth = 1;        w32tm.wDay = 1;        w32tm.wHour = 0;        w32tm.wMinute = 0;        w32tm.wSecond = 0;    } else {        w32tm.wYear = ltm->tm_year + 1900; /* year + 1900 -> year */        w32tm.wMonth = ltm->tm_mon + 1;    /* 0..11 -> 1..12 */        w32tm.wDay = ltm->tm_mday;         /* 1..31 */        w32tm.wHour = ltm->tm_hour;        /* 0..23 */        w32tm.wMinute = ltm->tm_min;       /* 0..59 */        w32tm.wSecond = ltm->tm_sec;       /* 0..61 in ANSI C */    }    SystemTimeToFileTime(&w32tm, &lft);    LocalFileTimeToFileTime(&lft, pft);} /* end function utime2VFatFileTime() */ /* nonzero if `y' is a leap year, else zero */#define leap(y) (((y)%4 == 0 && (y)%100 != 0) || (y)%400 == 0) /* number of leap years from 1970 to `y' (not including `y' itself) */#define nleap(y) (((y)-1969)/4 - ((y)-1901)/100 + ((y)-1601)/400)extern ZCONST ush ydays[];              /* defined in fileio.c */#if (defined(W32_STAT_BANDAID) && !defined(NO_W32TIMES_IZFIX))/*********************************//* Function NtfsFileTime2utime() *//*********************************/static int NtfsFileTime2utime(const FILETIME *pft, time_t *ut){#ifdef IZ_USE_INT64    ULLNG64 NTtime;    NTtime = ((ULLNG64)pft->dwLowDateTime +              ((ULLNG64)pft->dwHighDateTime << 32));#ifndef TIME_T_TYPE_DOUBLE    /* underflow and overflow handling */#ifdef CHECK_UTIME_SIGNED_UNSIGNED    if ((time_t)0x80000000L < (time_t)0L)    {        if (NTtime < ((ULLNG64)UNIX_TIME_SMIN_LO +                      ((ULLNG64)UNIX_TIME_SMIN_HI << 32))) {            *ut = (time_t)LONG_MIN;            return FALSE;        }        if (NTtime > ((ULLNG64)UNIX_TIME_SMAX_LO +                      ((ULLNG64)UNIX_TIME_SMAX_HI << 32))) {            *ut = (time_t)LONG_MAX;            return FALSE;        }    }    else#endif /* CHECK_UTIME_SIGNED_UNSIGNED */    {        if (NTtime < ((ULLNG64)UNIX_TIME_ZERO_LO +                      ((ULLNG64)UNIX_TIME_ZERO_HI << 32))) {            *ut = (time_t)0;            return FALSE;        }        if (NTtime > ((ULLNG64)UNIX_TIME_UMAX_LO +                      ((ULLNG64)UNIX_TIME_UMAX_HI << 32))) {            *ut = (time_t)ULONG_MAX;            return FALSE;        }    }#endif /* !TIME_T_TYPE_DOUBLE */    NTtime -= ((ULLNG64)UNIX_TIME_ZERO_LO +               ((ULLNG64)UNIX_TIME_ZERO_HI << 32));    *ut = (time_t)(NTtime / (unsigned long)NT_QUANTA_PER_UNIX);    return TRUE;#else /* !IZ_USE_INT64 (64-bit integer arithmetics may not be supported) */    time_t days;    SYSTEMTIME w32tm;#ifndef TIME_T_TYPE_DOUBLE    /* underflow and overflow handling */#ifdef CHECK_UTIME_SIGNED_UNSIGNED    if ((time_t)0x80000000L < (time_t)0L)    {        if ((pft->dwHighDateTime < UNIX_TIME_SMIN_HI) ||            ((pft->dwHighDateTime == UNIX_TIME_SMIN_HI) &&             (pft->dwLowDateTime < UNIX_TIME_SMIN_LO))) {            *ut = (time_t)LONG_MIN;            return FALSE;        if ((pft->dwHighDateTime > UNIX_TIME_SMAX_HI) ||            ((pft->dwHighDateTime == UNIX_TIME_SMAX_HI) &&             (pft->dwLowDateTime > UNIX_TIME_SMAX_LO))) {            *ut = (time_t)LONG_MAX;            return FALSE;        }    }    else#endif /* CHECK_UTIME_SIGNED_UNSIGNED */    {        if ((pft->dwHighDateTime < UNIX_TIME_ZERO_HI) ||            ((pft->dwHighDateTime == UNIX_TIME_ZERO_HI) &&             (pft->dwLowDateTime < UNIX_TIME_ZERO_LO))) {            *ut = (time_t)0;            return FALSE;        }        if ((pft->dwHighDateTime > UNIX_TIME_UMAX_HI) ||            ((pft->dwHighDateTime == UNIX_TIME_UMAX_HI) &&             (pft->dwLowDateTime > UNIX_TIME_UMAX_LO))) {            *ut = (time_t)ULONG_MAX;            return FALSE;        }    }#endif /* !TIME_T_TYPE_DOUBLE */    FileTimeToSystemTime(pft, &w32tm);    /* set `days' to the number of days into the year */    days = w32tm.wDay - 1 + ydays[w32tm.wMonth-1] +           (w32tm.wMonth > 2 && leap (w32tm.wYear));    /* now set `days' to the number of days since 1 Jan 1970 */    days += 365 * (time_t)(w32tm.wYear - 1970) +            (time_t)(nleap(w32tm.wYear));    *ut = (time_t)(86400L * days + 3600L * (time_t)w32tm.wHour +

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -