diff --git a/base/services/wkssvc/info.c b/base/services/wkssvc/info.c index 0cca6b7e788..98e90256ecd 100644 --- a/base/services/wkssvc/info.c +++ b/base/services/wkssvc/info.c @@ -22,41 +22,742 @@ WKSTA_INFO_502 WkstaInfo502; VOID InitWorkstationInfo(VOID) { - WkstaInfo502.wki502_char_wait = 0; - WkstaInfo502.wki502_collection_time = 250; - WkstaInfo502.wki502_maximum_collection_count = 16; - WkstaInfo502.wki502_keep_conn = 600; - WkstaInfo502.wki502_max_cmds = 50; - WkstaInfo502.wki502_sess_timeout = 60; - WkstaInfo502.wki502_siz_char_buf = 512; - WkstaInfo502.wki502_max_threads = 17; - WkstaInfo502.wki502_lock_quota = 6144; - WkstaInfo502.wki502_lock_increment = 10; - WkstaInfo502.wki502_lock_maximum = 500; - WkstaInfo502.wki502_pipe_increment = 10; - WkstaInfo502.wki502_pipe_maximum = 500; - WkstaInfo502.wki502_cache_file_timeout = 40; - WkstaInfo502.wki502_dormant_file_limit = 0; /* 1 */ - WkstaInfo502.wki502_read_ahead_throughput = 0; - WkstaInfo502.wki502_num_mailslot_buffers = 3; - WkstaInfo502.wki502_num_srv_announce_buffers = 20; - WkstaInfo502.wki502_max_illegal_datagram_events = 5; - WkstaInfo502.wki502_illegal_datagram_event_reset_frequency = 3600; - WkstaInfo502.wki502_log_election_packets = 0; - WkstaInfo502.wki502_use_opportunistic_locking = 1; - WkstaInfo502.wki502_use_unlock_behind = 1; - WkstaInfo502.wki502_use_close_behind = 1; - WkstaInfo502.wki502_buf_named_pipes = 1; - WkstaInfo502.wki502_use_lock_read_unlock = 1; - WkstaInfo502.wki502_utilize_nt_caching = 1; - WkstaInfo502.wki502_use_raw_read = 1; - WkstaInfo502.wki502_use_raw_write = 1; - WkstaInfo502.wki502_use_write_raw_data = 0; - WkstaInfo502.wki502_use_encryption = 1; - WkstaInfo502.wki502_buf_files_deny_write = 0; - WkstaInfo502.wki502_buf_read_only_files = 0; - WkstaInfo502.wki502_force_core_create_mode = 0; - WkstaInfo502.wki502_use_512_byte_max_transfer = 0; + HKEY hInfoKey = NULL; + DWORD dwType, dwSize, dwValue; + DWORD dwError; + + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\\CurrentControlSet\\Services\\LanmanWorkstation\\Parameters", + 0, + KEY_READ, + &hInfoKey); + if (dwError != ERROR_SUCCESS) + { + ERR("RegOpenKeyExW() failed!\n"); + return; + } + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"CharWait", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue <= 65535)) + WkstaInfo502.wki502_char_wait = dwValue; + else + WkstaInfo502.wki502_char_wait = 0; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"CollectionTime", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue <= 65535000)) + WkstaInfo502.wki502_collection_time = dwValue; + else + WkstaInfo502.wki502_collection_time = 250; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"MaximumCollectionCount", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue <= 65535)) + WkstaInfo502.wki502_maximum_collection_count = dwValue; + else + WkstaInfo502.wki502_maximum_collection_count = 16; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"KeepConn", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue >= 1) && (dwValue <= 65535)) + WkstaInfo502.wki502_keep_conn = dwValue; + else + WkstaInfo502.wki502_keep_conn = 600; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"MaxCmds", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue >= 50) && (dwValue <= 65535)) + WkstaInfo502.wki502_max_cmds = dwValue; + else + WkstaInfo502.wki502_max_cmds = 50; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"SessTimeout", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue >= 60) && (dwValue <= 65535)) + WkstaInfo502.wki502_sess_timeout = dwValue; + else + WkstaInfo502.wki502_sess_timeout = 60; + + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"SizCharBuf", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue >= 64) && (dwValue <= 4096)) + WkstaInfo502.wki502_siz_char_buf = dwValue; + else + WkstaInfo502.wki502_siz_char_buf = 512; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"MaxThreads", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if ((dwError == ERROR_SUCCESS) && (dwValue >= 1) && (dwValue <= 256)) + WkstaInfo502.wki502_max_threads = dwValue; + else + WkstaInfo502.wki502_max_threads = 17; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"LockQuota", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_lock_quota = dwValue; + else + WkstaInfo502.wki502_lock_quota = 6144; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"LockQuota", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_lock_quota = dwValue; + else + WkstaInfo502.wki502_lock_quota = 6144; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"LockIncrement", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_lock_increment = dwValue; + else + WkstaInfo502.wki502_lock_increment = 10; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"LockMaximum", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_lock_maximum = dwValue; + else + WkstaInfo502.wki502_lock_maximum = 500; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"PipeIncrement", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_pipe_increment = dwValue; + else + WkstaInfo502.wki502_pipe_increment = 10; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"PipeMaximum", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_pipe_maximum = dwValue; + else + WkstaInfo502.wki502_pipe_maximum = 500; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"CacheFileTimeout", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_cache_file_timeout = dwValue; + else + WkstaInfo502.wki502_cache_file_timeout = 40; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"DormantFileLimit", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS && dwValue >= 1) + WkstaInfo502.wki502_dormant_file_limit = dwValue; + else + WkstaInfo502.wki502_dormant_file_limit = 1; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"ReadAheadThroughput", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_read_ahead_throughput = dwValue; + else + WkstaInfo502.wki502_read_ahead_throughput = 0; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"MailslotBuffers", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_num_mailslot_buffers = dwValue; + else + WkstaInfo502.wki502_num_mailslot_buffers = 3; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"ServerAnnounceBuffers", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_num_srv_announce_buffers = dwValue; + else + WkstaInfo502.wki502_num_srv_announce_buffers = 20; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"NumIllegalDatagramEvents", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_max_illegal_datagram_events = dwValue; + else + WkstaInfo502.wki502_max_illegal_datagram_events = 5; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"IllegalDatagramResetTime", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_illegal_datagram_event_reset_frequency = dwValue; + else + WkstaInfo502.wki502_illegal_datagram_event_reset_frequency = 3600; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"LogElectionPackets", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_log_election_packets = dwValue; + else + WkstaInfo502.wki502_log_election_packets = 0; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"UseOpportunisticLocking", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_opportunistic_locking = dwValue; + else + WkstaInfo502.wki502_use_opportunistic_locking = 1; + + dwSize = sizeof(dwValue); + dwError = RegQueryValueExW(hInfoKey, + L"UseUnlockBehind", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_unlock_behind = dwValue; + else + WkstaInfo502.wki502_use_unlock_behind = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"UseCloseBehind", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_close_behind = dwValue; + else + WkstaInfo502.wki502_use_close_behind = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"BufNamedPipes", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_buf_named_pipes = dwValue; + else + WkstaInfo502.wki502_buf_named_pipes = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"UseLockReadUnlock", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_lock_read_unlock = dwValue; + else + WkstaInfo502.wki502_use_lock_read_unlock = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"UtilizeNtCaching", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_utilize_nt_caching = dwValue; + else + WkstaInfo502.wki502_utilize_nt_caching = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"UseRawRead", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_raw_read = dwValue; + else + WkstaInfo502.wki502_use_raw_read = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"UseRawWrite", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_raw_write = dwValue; + else + WkstaInfo502.wki502_use_raw_write = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"UseWriteRawData", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_write_raw_data = dwValue; + else + WkstaInfo502.wki502_use_write_raw_data = 0; + + dwError = RegQueryValueExW(hInfoKey, + L"UseEncryption", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_encryption = dwValue; + else + WkstaInfo502.wki502_use_encryption = 1; + + dwError = RegQueryValueExW(hInfoKey, + L"BufFilesDenyWrite", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_buf_files_deny_write = dwValue; + else + WkstaInfo502.wki502_buf_files_deny_write = 0; + + dwError = RegQueryValueExW(hInfoKey, + L"BufReadOnlyFiles", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_buf_read_only_files = dwValue; + else + WkstaInfo502.wki502_buf_read_only_files = 0; + + dwError = RegQueryValueExW(hInfoKey, + L"ForceCoreCreateMode", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_force_core_create_mode = dwValue; + else + WkstaInfo502.wki502_force_core_create_mode = 0; + + dwError = RegQueryValueExW(hInfoKey, + L"Use512ByteMaxTransfer", + 0, + &dwType, + (PBYTE)&dwValue, + &dwSize); + if (dwError == ERROR_SUCCESS) + WkstaInfo502.wki502_use_512_byte_max_transfer = dwValue; + else + WkstaInfo502.wki502_use_512_byte_max_transfer = 0; + + RegCloseKey(hInfoKey); +} + + +VOID +SaveWorkstationInfo( + _In_ DWORD Level) +{ + HKEY hInfoKey = NULL; + DWORD dwError; + + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\\CurrentControlSet\\Services\\LanmanWorkstation\\Parameters", + 0, + KEY_WRITE, + &hInfoKey); + if (dwError != ERROR_SUCCESS) + { + ERR("RegOpenKeyExW() failed!\n"); + return; + } + + switch (Level) + { + case 502: + RegSetValueExW(hInfoKey, + L"CharWait", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_char_wait, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"CollectionTime", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_collection_time, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"MaximumCollectionCount", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_maximum_collection_count, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"KeepConn", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_keep_conn, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"MaxCmds", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_max_cmds, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"SessTimeout", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_sess_timeout, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"SizCharBuf", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_siz_char_buf, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"MaxThreads", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_max_threads, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"LockQuota", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_lock_quota, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"LockIncrement", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_lock_increment, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"LockMaximum", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_lock_maximum, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"PipeIncrement", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_pipe_increment, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"PipeMaximum", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_pipe_maximum, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"CacheFileTimeout", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_cache_file_timeout, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"DormantFileLimit", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_dormant_file_limit, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"ReadAheadThroughput", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_read_ahead_throughput, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"MailslotBuffers", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_num_mailslot_buffers, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"ServerAnnounceBuffers", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_num_srv_announce_buffers, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"NumIllegalDatagramEvents", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_max_illegal_datagram_events, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"IllegalDatagramResetTime", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_illegal_datagram_event_reset_frequency, + sizeof(DWORD)); + + RegSetValueExW(hInfoKey, + L"LogElectionPackets", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_log_election_packets, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseOpportunisticLocking", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_opportunistic_locking, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseUnlockBehind", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_unlock_behind, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseCloseBehind", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_close_behind, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"BufNamedPipes", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_buf_named_pipes, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseLockReadUnlock", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_lock_read_unlock, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UtilizeNtCaching", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_utilize_nt_caching, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseRawRead", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_raw_read, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseRawWrite", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_raw_write, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseWriteRawData", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_write_raw_data, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"UseEncryption", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_encryption, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"BufFilesDenyWrite", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_buf_files_deny_write, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"BufReadOnlyFiles", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_buf_read_only_files, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"ForceCoreCreateMode", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_force_core_create_mode, + sizeof(BOOL)); + + RegSetValueExW(hInfoKey, + L"Use512ByteMaxTransfer", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_use_512_byte_max_transfer, + sizeof(BOOL)); + break; + + case 1013: + RegSetValueExW(hInfoKey, + L"KeepConn", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_keep_conn, + sizeof(DWORD)); + break; + + case 1018: + RegSetValueExW(hInfoKey, + L"SessTimeout", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_sess_timeout, + sizeof(DWORD)); + break; + + case 1046: + RegSetValueExW(hInfoKey, + L"DormantFileLimit", + 0, + REG_DWORD, + (PBYTE)&WkstaInfo502.wki502_dormant_file_limit, + sizeof(DWORD)); + break; + } + + RegCloseKey(hInfoKey); } /* EOF */ diff --git a/base/services/wkssvc/precomp.h b/base/services/wkssvc/precomp.h index 6c1622d0e65..b6d575316ab 100644 --- a/base/services/wkssvc/precomp.h +++ b/base/services/wkssvc/precomp.h @@ -50,6 +50,10 @@ NetpGetJoinInformation( VOID InitWorkstationInfo(VOID); +VOID +SaveWorkstationInfo( + _In_ DWORD Level); + /* rpcserver.c */ DWORD diff --git a/base/services/wkssvc/rpcserver.c b/base/services/wkssvc/rpcserver.c index f8e3655e099..703e35e6935 100644 --- a/base/services/wkssvc/rpcserver.c +++ b/base/services/wkssvc/rpcserver.c @@ -341,7 +341,11 @@ NetrWkstaSetInfo( break; } - /* FIXME: Store the workstation info in the registry */ + /* Save the workstation in the registry */ + if (dwResult == NERR_Success) + SaveWorkstationInfo(Level); + + /* FIXME: Notify the redirector */ return dwResult; }