123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- #include "php.h"
- #include "winutil.h"
- #include <bcrypt.h>
- #include <lmcons.h>
- PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error)
- {
- char *buf = NULL;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0, NULL
- );
- return (buf ? (char *) buf : "");
- }
- int php_win32_check_trailing_space(const char * path, const size_t path_len)
- {
- if (path_len > MAXPATHLEN - 1) {
- return 1;
- }
- if (path) {
- if (path[0] == ' ' || path[path_len - 1] == ' ') {
- return 0;
- } else {
- return 1;
- }
- } else {
- return 0;
- }
- }
- static BCRYPT_ALG_HANDLE bcrypt_algo;
- static BOOL has_bcrypt_algo = 0;
- #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
- #ifdef PHP_EXPORTS
- BOOL php_win32_shutdown_random_bytes(void)
- {
- BOOL ret = TRUE;
- if (has_bcrypt_algo) {
- ret = NT_SUCCESS(BCryptCloseAlgorithmProvider(bcrypt_algo, 0));
- has_bcrypt_algo = 0;
- }
- return ret;
- }
- BOOL php_win32_init_random_bytes(void)
- {
- if (has_bcrypt_algo) {
- return TRUE;
- }
- has_bcrypt_algo = NT_SUCCESS(BCryptOpenAlgorithmProvider(&bcrypt_algo, BCRYPT_RNG_ALGORITHM, NULL, 0));
- return has_bcrypt_algo;
- }
- #endif
- PHP_WINUTIL_API int php_win32_get_random_bytes(unsigned char *buf, size_t size)
- {
- BOOL ret;
- #if 0
-
- if (has_bcrypt_algo == 0) {
- return FAILURE;
- }
- #endif
-
- ret = NT_SUCCESS(BCryptGenRandom(bcrypt_algo, buf, (ULONG)size, 0));
- return ret ? SUCCESS : FAILURE;
- }
- PHP_WINUTIL_API int php_win32_code_to_errno(unsigned long w32Err)
- {
- size_t i;
- struct code_to_errno_map
- {
- unsigned long w32Err;
- int eerrno;
- };
- static const struct code_to_errno_map errmap[] =
- {
- { ERROR_INVALID_FUNCTION , EINVAL }
- , { ERROR_FILE_NOT_FOUND , ENOENT }
- , { ERROR_PATH_NOT_FOUND , ENOENT }
- , { ERROR_TOO_MANY_OPEN_FILES , EMFILE }
- , { ERROR_ACCESS_DENIED , EACCES }
- , { ERROR_INVALID_HANDLE , EBADF }
- , { ERROR_ARENA_TRASHED , ENOMEM }
- , { ERROR_NOT_ENOUGH_MEMORY , ENOMEM }
- , { ERROR_INVALID_BLOCK , ENOMEM }
- , { ERROR_BAD_ENVIRONMENT , E2BIG }
- , { ERROR_BAD_FORMAT , ENOEXEC }
- , { ERROR_INVALID_ACCESS , EINVAL }
- , { ERROR_INVALID_DATA , EINVAL }
- , { ERROR_OUTOFMEMORY , ENOMEM }
- , { ERROR_INVALID_DRIVE , ENOENT }
- , { ERROR_CURRENT_DIRECTORY , ECURDIR }
- , { ERROR_NOT_SAME_DEVICE , EXDEV }
- , { ERROR_NO_MORE_FILES , ENOENT }
- , { ERROR_WRITE_PROTECT , EROFS }
- , { ERROR_BAD_UNIT , ENXIO }
- , { ERROR_NOT_READY , EBUSY }
- , { ERROR_BAD_COMMAND , EIO }
- , { ERROR_CRC , EIO }
- , { ERROR_BAD_LENGTH , EIO }
- , { ERROR_SEEK , EIO }
- , { ERROR_NOT_DOS_DISK , EIO }
- , { ERROR_SECTOR_NOT_FOUND , ENXIO }
- , { ERROR_OUT_OF_PAPER , EBUSY }
- , { ERROR_WRITE_FAULT , EIO }
- , { ERROR_READ_FAULT , EIO }
- , { ERROR_GEN_FAILURE , EIO }
- , { ERROR_SHARING_VIOLATION , EAGAIN }
- , { ERROR_LOCK_VIOLATION , EACCES }
- , { ERROR_WRONG_DISK , ENXIO }
- , { 35 , ENFILE }
- , { ERROR_SHARING_BUFFER_EXCEEDED , ENFILE }
- , { ERROR_HANDLE_EOF , EINVAL }
- , { ERROR_HANDLE_DISK_FULL , ENOSPC }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_NOT_SUPPORTED , ENOSYS }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_BAD_NETPATH , ENOENT }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_NETWORK_ACCESS_DENIED , EACCES }
- #if 0
- , { 0 , 0 }
- #endif
- , { ERROR_BAD_NET_NAME , ENOENT }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_FILE_EXISTS , EEXIST }
- #if 0
- , { 0 , 0 }
- #endif
- , { ERROR_CANNOT_MAKE , EACCES }
- , { ERROR_FAIL_I24 , EACCES }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_INVALID_PARAMETER , EINVAL }
- #if 0
- , { 0 , 0 }
- #endif
- , { ERROR_NO_PROC_SLOTS , EAGAIN }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_DRIVE_LOCKED , EACCES }
- , { ERROR_BROKEN_PIPE , EPIPE }
- #if 0
- , { 0 , 0 }
- #endif
- , { ERROR_BUFFER_OVERFLOW , ENAMETOOLONG }
- , { ERROR_DISK_FULL , ENOSPC }
- #if 0
- , { 0 , 0 }
- #endif
- , { ERROR_INVALID_TARGET_HANDLE , EBADF }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_INSUFFICIENT_BUFFER , ERANGE }
- , { ERROR_INVALID_NAME , ENOENT }
- , { ERROR_INVALID_HANDLE , EINVAL }
- #if 0
- , { 0 , 0 }
- #endif
- , { ERROR_MOD_NOT_FOUND , ENOENT }
- , { ERROR_PROC_NOT_FOUND , ENOENT }
- , { ERROR_WAIT_NO_CHILDREN , ECHILD }
- , { ERROR_CHILD_NOT_COMPLETE , ECHILD }
- , { ERROR_DIRECT_ACCESS_HANDLE , EBADF }
- , { ERROR_NEGATIVE_SEEK , EINVAL }
- , { ERROR_SEEK_ON_DEVICE , EACCES }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_DIR_NOT_EMPTY , ENOTEMPTY }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_NOT_LOCKED , EACCES }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_BAD_PATHNAME , ENOENT }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_MAX_THRDS_REACHED , EAGAIN }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_LOCK_FAILED , EACCES }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_ALREADY_EXISTS , EEXIST }
- #if 0
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- , { 0 , 0 }
- #endif
- , { ERROR_FILENAME_EXCED_RANGE , ENAMETOOLONG }
- , { ERROR_NESTING_NOT_ALLOWED , EAGAIN }
- , { WAIT_TIMEOUT, ETIME}
- , { ERROR_DIRECTORY , ENOTDIR }
- , { ERROR_DIRECTORY_NOT_SUPPORTED , EISDIR }
- , { ERROR_IO_INCOMPLETE , EAGAIN }
- , { ERROR_IO_PENDING , EAGAIN }
- , { ERROR_INVALID_FLAGS , EINVAL }
- , { ERROR_NO_UNICODE_TRANSLATION , EINVAL }
- , { ERROR_NOT_FOUND , ENOENT }
- , { ERROR_USER_MAPPED_FILE , EACCES }
- , { ERROR_NOT_ENOUGH_QUOTA , ENOMEM }
- , { ERROR_ABANDONED_WAIT_0 , EIO }
- };
- for(i = 0; i < sizeof(errmap)/sizeof(struct code_to_errno_map); ++i)
- {
- if(w32Err == errmap[i].w32Err)
- {
- return errmap[i].eerrno;
- }
- }
- assert(!"Unrecognised value");
- return EINVAL;
- }
- PHP_WINUTIL_API char *php_win32_get_username(void)
- {
- wchar_t unamew[UNLEN + 1];
- size_t uname_len;
- char *uname;
- DWORD unsize = UNLEN;
- GetUserNameW(unamew, &unsize);
- uname = php_win32_cp_conv_w_to_any(unamew, unsize - 1, &uname_len);
- if (!uname) {
- return NULL;
- }
-
- if (uname_len > UNLEN) {
- uname[uname_len] = '\0';
- }
- return uname;
- }
|