Windows: dynamically load some ntdll functions
This commit is contained in:
parent
2d40e35b7e
commit
a2ee4854c6
2
all.gyp
2
all.gyp
@ -142,6 +142,7 @@
|
|||||||
'src/win/handle.c',
|
'src/win/handle.c',
|
||||||
'src/win/internal.h',
|
'src/win/internal.h',
|
||||||
'src/win/loop-watcher.c',
|
'src/win/loop-watcher.c',
|
||||||
|
'src/win/ntdll.h',
|
||||||
'src/win/pipe.c',
|
'src/win/pipe.c',
|
||||||
'src/win/process.c',
|
'src/win/process.c',
|
||||||
'src/win/req.c',
|
'src/win/req.c',
|
||||||
@ -150,6 +151,7 @@
|
|||||||
'src/win/tcp.c',
|
'src/win/tcp.c',
|
||||||
'src/win/timer.c',
|
'src/win/timer.c',
|
||||||
'src/win/util.c',
|
'src/win/util.c',
|
||||||
|
'src/win/winapi.c',
|
||||||
]
|
]
|
||||||
}, { # Not Windows i.e. POSIX
|
}, { # Not Windows i.e. POSIX
|
||||||
'cflags': [
|
'cflags': [
|
||||||
|
|||||||
@ -70,6 +70,9 @@ void uv_init() {
|
|||||||
/* Initialize winsock */
|
/* Initialize winsock */
|
||||||
uv_winsock_startup();
|
uv_winsock_startup();
|
||||||
|
|
||||||
|
/* Fetch winapi function pointers */
|
||||||
|
uv_winapi_init();
|
||||||
|
|
||||||
/* Intialize event loop */
|
/* Intialize event loop */
|
||||||
uv_loop_init();
|
uv_loop_init();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,9 @@
|
|||||||
|
|
||||||
#include "uv.h"
|
#include "uv.h"
|
||||||
#include "../uv-common.h"
|
#include "../uv-common.h"
|
||||||
|
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
|
#include "ntdll.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -234,4 +236,13 @@ void uv_set_sys_error(int sys_errno);
|
|||||||
void uv_set_error(uv_err_code code, int sys_errno);
|
void uv_set_error(uv_err_code code, int sys_errno);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Windows api functions that we need to retrieve dynamically
|
||||||
|
*/
|
||||||
|
void uv_winapi_init();
|
||||||
|
|
||||||
|
extern sRtlNtStatusToDosError pRtlNtStatusToDosError;
|
||||||
|
extern sNtQueryInformationFile pNtQueryInformationFile;
|
||||||
|
|
||||||
|
|
||||||
#endif /* UV_WIN_INTERNAL_H_ */
|
#endif /* UV_WIN_INTERNAL_H_ */
|
||||||
|
|||||||
130
src/win/ntdll.h
Normal file
130
src/win/ntdll.h
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UV_WIN_NTDLL_H_
|
||||||
|
#define UV_WIN_NTDLL_H_
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _NTDEF_
|
||||||
|
typedef LONG NTSTATUS;
|
||||||
|
typedef NTSTATUS *PNTSTATUS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define STATUS_SUCCESS ((NTSTATUS)0x0)
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _IO_STATUS_BLOCK {
|
||||||
|
union {
|
||||||
|
NTSTATUS Status;
|
||||||
|
PVOID Pointer;
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
ULONG_PTR Information;
|
||||||
|
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _FILE_PIPE_LOCAL_INFORMATION {
|
||||||
|
ULONG NamedPipeType;
|
||||||
|
ULONG NamedPipeConfiguration;
|
||||||
|
ULONG MaximumInstances;
|
||||||
|
ULONG CurrentInstances;
|
||||||
|
ULONG InboundQuota;
|
||||||
|
ULONG ReadDataAvailable;
|
||||||
|
ULONG OutboundQuota;
|
||||||
|
ULONG WriteQuotaAvailable;
|
||||||
|
ULONG NamedPipeState;
|
||||||
|
ULONG NamedPipeEnd;
|
||||||
|
} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum _FILE_INFORMATION_CLASS {
|
||||||
|
FileDirectoryInformation = 1,
|
||||||
|
FileFullDirectoryInformation,
|
||||||
|
FileBothDirectoryInformation,
|
||||||
|
FileBasicInformation,
|
||||||
|
FileStandardInformation,
|
||||||
|
FileInternalInformation,
|
||||||
|
FileEaInformation,
|
||||||
|
FileAccessInformation,
|
||||||
|
FileNameInformation,
|
||||||
|
FileRenameInformation,
|
||||||
|
FileLinkInformation,
|
||||||
|
FileNamesInformation,
|
||||||
|
FileDispositionInformation,
|
||||||
|
FilePositionInformation,
|
||||||
|
FileFullEaInformation,
|
||||||
|
FileModeInformation,
|
||||||
|
FileAlignmentInformation,
|
||||||
|
FileAllInformation,
|
||||||
|
FileAllocationInformation,
|
||||||
|
FileEndOfFileInformation,
|
||||||
|
FileAlternateNameInformation,
|
||||||
|
FileStreamInformation,
|
||||||
|
FilePipeInformation,
|
||||||
|
FilePipeLocalInformation,
|
||||||
|
FilePipeRemoteInformation,
|
||||||
|
FileMailslotQueryInformation,
|
||||||
|
FileMailslotSetInformation,
|
||||||
|
FileCompressionInformation,
|
||||||
|
FileObjectIdInformation,
|
||||||
|
FileCompletionInformation,
|
||||||
|
FileMoveClusterInformation,
|
||||||
|
FileQuotaInformation,
|
||||||
|
FileReparsePointInformation,
|
||||||
|
FileNetworkOpenInformation,
|
||||||
|
FileAttributeTagInformation,
|
||||||
|
FileTrackingInformation,
|
||||||
|
FileIdBothDirectoryInformation,
|
||||||
|
FileIdFullDirectoryInformation,
|
||||||
|
FileValidDataLengthInformation,
|
||||||
|
FileShortNameInformation,
|
||||||
|
FileIoCompletionNotificationInformation,
|
||||||
|
FileIoStatusBlockRangeInformation,
|
||||||
|
FileIoPriorityHintInformation,
|
||||||
|
FileSfioReserveInformation,
|
||||||
|
FileSfioVolumeInformation,
|
||||||
|
FileHardLinkInformation,
|
||||||
|
FileProcessIdsUsingFileInformation,
|
||||||
|
FileNormalizedNameInformation,
|
||||||
|
FileNetworkPhysicalNameInformation,
|
||||||
|
FileIdGlobalTxDirectoryInformation,
|
||||||
|
FileIsRemoteDeviceInformation,
|
||||||
|
FileAttributeCacheInformation,
|
||||||
|
FileNumaNodeInformation,
|
||||||
|
FileStandardLinkInformation,
|
||||||
|
FileRemoteProtocolInformation,
|
||||||
|
FileMaximumInformation
|
||||||
|
} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
|
||||||
|
|
||||||
|
|
||||||
|
typedef ULONG (NTAPI *sRtlNtStatusToDosError)
|
||||||
|
(NTSTATUS Status);
|
||||||
|
|
||||||
|
typedef NTSTATUS (NTAPI *sNtQueryInformationFile)
|
||||||
|
(HANDLE FileHandle,
|
||||||
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
PVOID FileInformation,
|
||||||
|
ULONG Length,
|
||||||
|
FILE_INFORMATION_CLASS FileInformationClass);
|
||||||
|
|
||||||
|
#endif /* UV_WIN_NTDLL_H_ */
|
||||||
52
src/win/winapi.c
Normal file
52
src/win/winapi.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "uv.h"
|
||||||
|
#include "../uv-common.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
sRtlNtStatusToDosError pRtlNtStatusToDosError;
|
||||||
|
sNtQueryInformationFile pNtQueryInformationFile;
|
||||||
|
|
||||||
|
|
||||||
|
void uv_winapi_init() {
|
||||||
|
HMODULE module;
|
||||||
|
|
||||||
|
module = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (module == NULL) {
|
||||||
|
uv_fatal_error(GetLastError(), "GetModuleHandleA");
|
||||||
|
}
|
||||||
|
|
||||||
|
pRtlNtStatusToDosError = (sRtlNtStatusToDosError) GetProcAddress(module,
|
||||||
|
"RtlNtStatusToDosError");
|
||||||
|
if (pRtlNtStatusToDosError == NULL) {
|
||||||
|
uv_fatal_error(GetLastError(), "GetProcAddress");
|
||||||
|
}
|
||||||
|
|
||||||
|
pNtQueryInformationFile = (sNtQueryInformationFile) GetProcAddress(module,
|
||||||
|
"NtQueryInformationFile");
|
||||||
|
if (pNtQueryInformationFile == NULL) {
|
||||||
|
uv_fatal_error(GetLastError(), "GetProcAddress");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user