📄 win32.c
字号:
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 + -