[XAM] Cut handle mask from socket handles, added support for: NetDll_getsockopt

Only positive values should be interpreted as valid sockets!
This commit is contained in:
Gliniak 2022-06-08 19:59:15 +02:00
parent 25f3e16baa
commit d0175ddf2f
4 changed files with 38 additions and 1 deletions

View File

@ -50,6 +50,9 @@ class ObjectTable {
template <typename T>
object_ref<T> LookupObject(X_HANDLE handle) {
auto object = LookupObject(handle, false);
if (T::kObjectType == XObject::Type::Socket) {
object = LookupObject((handle | 0xF8000000), false);
}
if (object) {
assert_true(object->type() == T::kObjectType);
}

View File

@ -639,7 +639,7 @@ dword_result_t NetDll_socket_entry(dword_t caller, dword_t af, dword_t type,
return -1;
}
return socket->handle();
return (socket->handle() & 0x00FFFFFF);
}
DECLARE_XAM_EXPORT1(NetDll_socket, kNetworking, kImplemented);
@ -691,6 +691,22 @@ dword_result_t NetDll_setsockopt_entry(dword_t caller, dword_t socket_handle,
}
DECLARE_XAM_EXPORT1(NetDll_setsockopt, kNetworking, kImplemented);
dword_result_t NetDll_getsockopt_entry(dword_t caller, dword_t socket_handle,
dword_t level, dword_t optname,
lpvoid_t optval_ptr, lpdword_t optlen) {
auto socket =
kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);
if (!socket) {
XThread::SetLastError(uint32_t(X_WSAError::X_WSAENOTSOCK));
return -1;
}
int native_len = *optlen;
X_STATUS status = socket->GetOption(level, optname, optval_ptr, &native_len);
return XSUCCEEDED(status) ? 0 : -1;
}
DECLARE_XAM_EXPORT1(NetDll_getsockopt, kNetworking, kImplemented);
dword_result_t NetDll_ioctlsocket_entry(dword_t caller, dword_t socket_handle,
dword_t cmd, lpvoid_t arg_ptr) {
auto socket =
@ -1044,6 +1060,12 @@ dword_result_t NetDll_XNetRegisterKey_entry(dword_t caller, lpdword_t key_id,
}
DECLARE_XAM_EXPORT1(NetDll_XNetRegisterKey, kNetworking, kStub);
dword_result_t NetDll_XNetUnregisterKey_entry(dword_t caller, lpdword_t key_id,
lpdword_t exchange_key) {
return 0;
}
DECLARE_XAM_EXPORT1(NetDll_XNetUnregisterKey, kNetworking, kStub);
} // namespace xam
} // namespace kernel
} // namespace xe

View File

@ -73,6 +73,16 @@ X_STATUS XSocket::Close() {
return X_STATUS_SUCCESS;
}
X_STATUS XSocket::GetOption(uint32_t level, uint32_t optname, void* optval_ptr,
int* optlen) {
int ret =
getsockopt(native_handle_, level, optname, (char*)optval_ptr, optlen);
if (ret < 0) {
// TODO: WSAGetLastError()
return X_STATUS_UNSUCCESSFUL;
}
return X_STATUS_SUCCESS;
}
X_STATUS XSocket::SetOption(uint32_t level, uint32_t optname, void* optval_ptr,
uint32_t optlen) {
if (level == 0xFFFF && (optname == 0x5801 || optname == 0x5802)) {

View File

@ -107,6 +107,8 @@ class XSocket : public XObject {
X_STATUS Initialize(AddressFamily af, Type type, Protocol proto);
X_STATUS Close();
X_STATUS GetOption(uint32_t level, uint32_t optname, void* optval_ptr,
int* optlen);
X_STATUS SetOption(uint32_t level, uint32_t optname, void* optval_ptr,
uint32_t optlen);
X_STATUS IOControl(uint32_t cmd, uint8_t* arg_ptr);