{"action":"created","comment":{"url":"https://api.github.com/repos/reactos/reactos/pulls/comments/168915671","pull_request_review_id":97368240,"id":168915671,"diff_hunk":"@@ -0,0 +1,366 @@\n+/*\n+ * PROJECT:     ReactOS W32Time Service\n+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)\n+ * PURPOSE:     Create W32Time Service that reqularly syncs clock to Internet Time\n+ * COPYRIGHT:   Copyright 2018 Doug Lyons\n+ */\n+\n+#include<windows.h>\n+#include <debug.h>\n+#include <strsafe.h>\n+\n+#include \"timedate.h\"\n+\n+SERVICE_STATUS ServiceStatus; \n+SERVICE_STATUS_HANDLE hStatus;\n+static WCHAR ServiceName[] = L\"W32Time\";\n+ \n+int InitService(VOID);\n+ULONG GetServerTime(LPWSTR lpAddress);\n+\n+/* Copied from internettime.c */\n+static VOID\n+UpdateSystemTime(ULONG ulTime)\n+{\n+    FILETIME ftNew;\n+    LARGE_INTEGER li;\n+    SYSTEMTIME stNew;\n+\n+    /* Time at 1st Jan 1900 */\n+    stNew.wYear = 1900;\n+    stNew.wMonth = 1;\n+    stNew.wDay = 1;\n+    stNew.wHour = 0;\n+    stNew.wMinute = 0;\n+    stNew.wSecond = 0;\n+    stNew.wMilliseconds = 0;\n+\n+    /* Convert to a file time */\n+    if (!SystemTimeToFileTime(&stNew, &ftNew))\n+    {\n+        return;\n+    }\n+\n+    /* Add on the time passed since 1st Jan 1900 */\n+    li = *(LARGE_INTEGER *)&ftNew;\n+    li.QuadPart += (LONGLONG)10000000 * ulTime;\n+    ftNew = * (FILETIME *)&li;\n+\n+    /* Convert back to a system time */\n+    if (!FileTimeToSystemTime(&ftNew, &stNew))\n+    {\n+        return;\n+    }\n+\n+    /* Use SystemSetTime with SystemTime = TRUE to set System Time */\n+    SystemSetTime(&stNew, TRUE);\n+}\n+\n+/* Copied from dateandtime.c */\n+BOOL\n+SystemSetTime(LPSYSTEMTIME lpSystemTime,\n+              BOOL SystemTime)\n+{\n+    HANDLE hToken;\n+    DWORD PrevSize;\n+    TOKEN_PRIVILEGES priv, previouspriv;\n+    BOOL Ret = FALSE;\n+\n+    /*\n+     * Enable the SeSystemtimePrivilege privilege\n+     */\n+\n+    if (OpenProcessToken(GetCurrentProcess(),\n+                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,\n+                         &hToken))\n+    {\n+        priv.PrivilegeCount = 1;\n+        priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n+\n+        if (LookupPrivilegeValue(NULL,\n+                                  SE_SYSTEMTIME_NAME,\n+                                  &priv.Privileges[0].Luid))\n+        {\n+            if (AdjustTokenPrivileges(hToken,\n+                                      FALSE,\n+                                      &priv,\n+                                      sizeof(previouspriv),\n+                                      &previouspriv,\n+                                      &PrevSize) &&\n+                GetLastError() == ERROR_SUCCESS)\n+            {\n+                /*\n+                 * We successfully enabled it, we're permitted to change the time.\n+                 * Check the second parameter for SystemTime and if TRUE set System Time.\n+                 * Otherwise, if FALSE set the Local Time.\n+                 * Call SetLocalTime twice to ensure correct results.\n+                 */\n+                if (SystemTime)\n+                {\n+                    Ret = SetSystemTime(lpSystemTime);\n+                }\n+                else\n+                {\n+                    Ret = SetLocalTime(lpSystemTime) &&\n+                          SetLocalTime(lpSystemTime);\n+                }\n+\n+                /*\n+                 * For the sake of security, restore the previous status again\n+                 */\n+                if (previouspriv.PrivilegeCount > 0)\n+                {\n+                    AdjustTokenPrivileges(hToken,\n+                                          FALSE,\n+                                          &previouspriv,\n+                                          0,\n+                                          NULL,\n+                                          0);\n+                }\n+            }\n+        }\n+        CloseHandle(hToken);\n+    }\n+\n+    return Ret;\n+}\n+\n+static DWORD\n+GetIntervalSetting()\n+{\n+    HKEY hKey;\n+    DWORD dwData;\n+    DWORD dwSize = sizeof(DWORD);\n+\n+    dwData = 0;\n+    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,\n+                      L\"SYSTEM\\\\CurrentControlSet\\\\Services\\\\W32Time\\\\TimeProviders\\\\NtpClient\",\n+                      0,\n+                      KEY_QUERY_VALUE,\n+                      &hKey) == ERROR_SUCCESS)\n+    {\n+        RegQueryValueExW(hKey,\n+                             L\"SpecialPollInterval\",\n+                             NULL,\n+                             NULL,\n+                             (LPBYTE)&dwData,\n+                             &dwSize);\n+        RegCloseKey(hKey);\n+    }\n+    return dwData;\n+}\n+\n+\n+int\n+SetTime(VOID)\n+{\n+    ULONG ulTime;\n+    LONG lRet;\n+    HKEY hKey;\n+    DWORD dwIndex = 0;\n+    DWORD dwValSize;\n+    DWORD dwNameSize;\n+    WCHAR szValName[MAX_VALUE_NAME];\n+    WCHAR szData[256];\n+    WCHAR szDefault[256];\n+\n+\n+    lRet = RegOpenKeyExW(HKEY_LOCAL_MACHINE,\n+                        L\"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\DateTime\\\\Servers\",\n+                        0,\n+                        KEY_QUERY_VALUE,\n+                        &hKey);\n+    if (lRet != ERROR_SUCCESS)\n+    {\n+        return 1;\n+    }\n+\n+    while (TRUE)\n+    {\n+        dwValSize = MAX_VALUE_NAME * sizeof(WCHAR);\n+        szValName[0] = L'\\0';\n+        lRet = RegEnumValueW(hKey,\n+                             dwIndex,\n+                             szValName,\n+                             &dwValSize,\n+                             NULL,\n+                             NULL,\n+                             (LPBYTE)szData,\n+                             &dwNameSize);\n+        if (lRet == ERROR_SUCCESS)\n+        {\n+            /* Get data from default reg value */\n+            if (szValName[0] == UNICODE_NULL) // if this is the \"(Default)\" key\n+            {\n+                StringCbCopy(szDefault, wcslen(szDefault), szData);\n+            }\n+            dwIndex++;\n+        }\n+        else if (lRet != ERROR_MORE_DATA)\n+        {\n+            break;\n+        }\n+    }\n+\n+\n+    dwIndex = 0;\n+    while (TRUE)\n+    {\n+        dwValSize = MAX_VALUE_NAME * sizeof(WCHAR);\n+        szValName[0] = L'\\0';\n+        lRet = RegEnumValueW(hKey,\n+                             dwIndex,\n+                             szValName,\n+                             &dwValSize,\n+                             NULL,\n+                             NULL,\n+                             (LPBYTE)szData,\n+                             &dwNameSize);\n+        if (lRet == ERROR_SUCCESS)\n+        {\n+            /* Get date from selected reg value */\n+            if (wcscmp(szValName, szDefault) == 0) // if (Index == Default)\n+            {\n+                StringCbCopy(szDefault, wcslen(szDefault), szData);\n+            }\n+            dwIndex++;\n+        }\n+        else if (lRet != ERROR_MORE_DATA)\n+        {\n+            break;\n+        }\n+    }\n+\n+    RegCloseKey(hKey);\n+\n+    ulTime = GetServerTime(szDefault);\n+\n+    if (ulTime != 0)\n+        UpdateSystemTime(ulTime);\n+\n+    return 0;\n+}\n+\n+// Control handler function\n+VOID WINAPI\n+ControlHandler(DWORD request) \n+{ \n+    switch(request) \n+    { \n+        case SERVICE_CONTROL_STOP: \n+            DPRINT(\"W32Time Service stopped.\\n\");\n+\n+            ServiceStatus.dwWin32ExitCode = 0; \n+            ServiceStatus.dwCurrentState  = SERVICE_STOPPED; \n+            SetServiceStatus (hStatus, &ServiceStatus);\n+            return; \n+ \n+        case SERVICE_CONTROL_SHUTDOWN: \n+            DPRINT1(\"W32Time Service stopped.\\n\");\n+\n+            ServiceStatus.dwWin32ExitCode = 0; \n+            ServiceStatus.dwCurrentState  = SERVICE_STOPPED; \n+            SetServiceStatus (hStatus, &ServiceStatus);\n+            return; \n+        \n+        default:\n+            break;\n+    } \n+ \n+    // Report current status\n+    SetServiceStatus (hStatus,  &ServiceStatus);\n+ \n+    return; \n+}\n+\n+static VOID CALLBACK\n+ServiceMain(DWORD argc, LPWSTR *argv)\n+{\n+    int   error;\n+    int   result;\n+    DWORD dwPollInterval;\n+ \n+    UNREFERENCED_PARAMETER(argc);\n+    UNREFERENCED_PARAMETER(argv);\n+\n+    ServiceStatus.dwServiceType             = SERVICE_WIN32; \n+    ServiceStatus.dwCurrentState            = SERVICE_START_PENDING; \n+    ServiceStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;\n+    ServiceStatus.dwWin32ExitCode           = 0; \n+    ServiceStatus.dwServiceSpecificExitCode = 0; \n+    ServiceStatus.dwCheckPoint              = 0; \n+    ServiceStatus.dwWaitHint                = 0; \n+ \n+    hStatus = RegisterServiceCtrlHandler(ServiceName,\n+\t\t                         ControlHandler);  // (LPHANDLER_FUNCTION)\n+    if (hStatus == (SERVICE_STATUS_HANDLE)0) \n+    { \n+        // Registering Control Handler failed\n+        return; \n+    }  \n+    // Initialize Service \n+    error = InitService(); \n+    if (error) \n+    {\n+        // Initialization failed\n+        ServiceStatus.dwCurrentState       = SERVICE_STOPPED; \n+        ServiceStatus.dwWin32ExitCode      = -1; \n+        SetServiceStatus(hStatus, &ServiceStatus); \n+        return; \n+    } \n+    // We report the running status to SCM. \n+    ServiceStatus.dwCurrentState = SERVICE_RUNNING; \n+    SetServiceStatus (hStatus, &ServiceStatus);\n+ \n+    // The worker loop of a service\n+    while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)\n+        {\n+            dwPollInterval = GetIntervalSetting();\n+            result = SetTime();\n+            if (result)\n+            {\n+                ServiceStatus.dwCurrentState       = SERVICE_STOPPED; \n+                ServiceStatus.dwWin32ExitCode      = -1; \n+                SetServiceStatus(hStatus, &ServiceStatus);\n+                return;\n+            }\n+            Sleep(dwPollInterval);\n+        }\n+    return; \n+}\n+\n+int wmain(int argc, WCHAR *argv[]) \n+{\n+\n+    SERVICE_TABLE_ENTRYW ServiceTable[2] =\n+    {\n+        {ServiceName, ServiceMain},\n+        {NULL, NULL}\n+    };\n+\n+    UNREFERENCED_PARAMETER(argc);\n+    UNREFERENCED_PARAMETER(argv);\n+\n+    DPRINT(\"W32Time: main() started\\n\");\n+\n+    // Start the control dispatcher thread for our service\n+    StartServiceCtrlDispatcher(ServiceTable);\n+\n+    DPRINT(\"W32Time: main() done\\n\");\n+\n+    ExitThread(0);\n+\n+    return 0; \n+}\n+ \n+// Service initialization\n+int InitService(VOID) \n+{ \n+    int result;\n+    result = SetTime();\n+    DPRINT1(\"W32Time Service started.\\n\");\n+    return(result); ","path":"base/services/w32time/W32Time.c","position":362,"original_position":362,"commit_id":"c6c9b1b1de6e1a53b4cac7de42bb191a691ddfd8","original_commit_id":"c6c9b1b1de6e1a53b4cac7de42bb191a691ddfd8","user":{"login":"Doug-Lyons","id":32620577,"avatar_url":"https://avatars3.githubusercontent.com/u/32620577?v=4","gravatar_id":"","url":"https://api.github.com/users/Doug-Lyons","html_url":"https://github.com/Doug-Lyons","followers_url":"https://api.github.com/users/Doug-Lyons/followers","following_url":"https://api.github.com/users/Doug-Lyons/following{/other_user}","gists_url":"https://api.github.com/users/Doug-Lyons/gists{/gist_id}","starred_url":"https://api.github.com/users/Doug-Lyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Doug-Lyons/subscriptions","organizations_url":"https://api.github.com/users/Doug-Lyons/orgs","repos_url":"https://api.github.com/users/Doug-Lyons/repos","events_url":"https://api.github.com/users/Doug-Lyons/events{/privacy}","received_events_url":"https://api.github.com/users/Doug-Lyons/received_events","type":"User","site_admin":false},"body":"I will change to \"return result\". I like the idea of having an \"InitService\" function so you can tell what was intended here and I am not sure if something else might be needed, so I prefer to leave it for now. Thanks.","created_at":"2018-02-17T07:46:54Z","updated_at":"2018-02-17T07:46:54Z","html_url":"https://github.com/reactos/reactos/pull/373#discussion_r168915671","pull_request_url":"https://api.github.com/repos/reactos/reactos/pulls/373","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/reactos/reactos/pulls/comments/168915671"},"html":{"href":"https://github.com/reactos/reactos/pull/373#discussion_r168915671"},"pull_request":{"href":"https://api.github.com/repos/reactos/reactos/pulls/373"}},"in_reply_to_id":168712167},"pull_request":{"url":"https://api.github.com/repos/reactos/reactos/pulls/373","id":168430599,"html_url":"https://github.com/reactos/reactos/pull/373","diff_url":"https://github.com/reactos/reactos/pull/373.diff","patch_url":"https://github.com/reactos/reactos/pull/373.patch","issue_url":"https://api.github.com/repos/reactos/reactos/issues/373","number":373,"state":"open","locked":false,"title":"Create W32Time Service","user":{"login":"Doug-Lyons","id":32620577,"avatar_url":"https://avatars3.githubusercontent.com/u/32620577?v=4","gravatar_id":"","url":"https://api.github.com/users/Doug-Lyons","html_url":"https://github.com/Doug-Lyons","followers_url":"https://api.github.com/users/Doug-Lyons/followers","following_url":"https://api.github.com/users/Doug-Lyons/following{/other_user}","gists_url":"https://api.github.com/users/Doug-Lyons/gists{/gist_id}","starred_url":"https://api.github.com/users/Doug-Lyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Doug-Lyons/subscriptions","organizations_url":"https://api.github.com/users/Doug-Lyons/orgs","repos_url":"https://api.github.com/users/Doug-Lyons/repos","events_url":"https://api.github.com/users/Doug-Lyons/events{/privacy}","received_events_url":"https://api.github.com/users/Doug-Lyons/received_events","type":"User","site_admin":false},"body":"## Add W32Time Service\r\n\r\nJIRA issue: [CORE-13001](https://jira.reactos.org/browse/CORE-13001)\r\n\r\n## Proposed changes\r\nAdd Service for W32Time.\r\nI am a novice programmer in C, so please take this into account with your comments. Thanks.\r\n\r\n","created_at":"2018-02-11T01:29:12Z","updated_at":"2018-02-17T07:46:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4850ef0fe0bc7b9e53e62ea7f2ec92809ecfbc72","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/reactos/reactos/pulls/373/commits","review_comments_url":"https://api.github.com/repos/reactos/reactos/pulls/373/comments","review_comment_url":"https://api.github.com/repos/reactos/reactos/pulls/comments{/number}","comments_url":"https://api.github.com/repos/reactos/reactos/issues/373/comments","statuses_url":"https://api.github.com/repos/reactos/reactos/statuses/c6c9b1b1de6e1a53b4cac7de42bb191a691ddfd8","head":{"label":"Doug-Lyons:master","ref":"master","sha":"c6c9b1b1de6e1a53b4cac7de42bb191a691ddfd8","user":{"login":"Doug-Lyons","id":32620577,"avatar_url":"https://avatars3.githubusercontent.com/u/32620577?v=4","gravatar_id":"","url":"https://api.github.com/users/Doug-Lyons","html_url":"https://github.com/Doug-Lyons","followers_url":"https://api.github.com/users/Doug-Lyons/followers","following_url":"https://api.github.com/users/Doug-Lyons/following{/other_user}","gists_url":"https://api.github.com/users/Doug-Lyons/gists{/gist_id}","starred_url":"https://api.github.com/users/Doug-Lyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Doug-Lyons/subscriptions","organizations_url":"https://api.github.com/users/Doug-Lyons/orgs","repos_url":"https://api.github.com/users/Doug-Lyons/repos","events_url":"https://api.github.com/users/Doug-Lyons/events{/privacy}","received_events_url":"https://api.github.com/users/Doug-Lyons/received_events","type":"User","site_admin":false},"repo":{"id":115593490,"name":"reactos","full_name":"Doug-Lyons/reactos","owner":{"login":"Doug-Lyons","id":32620577,"avatar_url":"https://avatars3.githubusercontent.com/u/32620577?v=4","gravatar_id":"","url":"https://api.github.com/users/Doug-Lyons","html_url":"https://github.com/Doug-Lyons","followers_url":"https://api.github.com/users/Doug-Lyons/followers","following_url":"https://api.github.com/users/Doug-Lyons/following{/other_user}","gists_url":"https://api.github.com/users/Doug-Lyons/gists{/gist_id}","starred_url":"https://api.github.com/users/Doug-Lyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Doug-Lyons/subscriptions","organizations_url":"https://api.github.com/users/Doug-Lyons/orgs","repos_url":"https://api.github.com/users/Doug-Lyons/repos","events_url":"https://api.github.com/users/Doug-Lyons/events{/privacy}","received_events_url":"https://api.github.com/users/Doug-Lyons/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Doug-Lyons/reactos","description":"A free Windows-compatible Operating System","fork":true,"url":"https://api.github.com/repos/Doug-Lyons/reactos","forks_url":"https://api.github.com/repos/Doug-Lyons/reactos/forks","keys_url":"https://api.github.com/repos/Doug-Lyons/reactos/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Doug-Lyons/reactos/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Doug-Lyons/reactos/teams","hooks_url":"https://api.github.com/repos/Doug-Lyons/reactos/hooks","issue_events_url":"https://api.github.com/repos/Doug-Lyons/reactos/issues/events{/number}","events_url":"https://api.github.com/repos/Doug-Lyons/reactos/events","assignees_url":"https://api.github.com/repos/Doug-Lyons/reactos/assignees{/user}","branches_url":"https://api.github.com/repos/Doug-Lyons/reactos/branches{/branch}","tags_url":"https://api.github.com/repos/Doug-Lyons/reactos/tags","blobs_url":"https://api.github.com/repos/Doug-Lyons/reactos/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Doug-Lyons/reactos/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Doug-Lyons/reactos/git/refs{/sha}","trees_url":"https://api.github.com/repos/Doug-Lyons/reactos/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Doug-Lyons/reactos/statuses/{sha}","languages_url":"https://api.github.com/repos/Doug-Lyons/reactos/languages","stargazers_url":"https://api.github.com/repos/Doug-Lyons/reactos/stargazers","contributors_url":"https://api.github.com/repos/Doug-Lyons/reactos/contributors","subscribers_url":"https://api.github.com/repos/Doug-Lyons/reactos/subscribers","subscription_url":"https://api.github.com/repos/Doug-Lyons/reactos/subscription","commits_url":"https://api.github.com/repos/Doug-Lyons/reactos/commits{/sha}","git_commits_url":"https://api.github.com/repos/Doug-Lyons/reactos/git/commits{/sha}","comments_url":"https://api.github.com/repos/Doug-Lyons/reactos/comments{/number}","issue_comment_url":"https://api.github.com/repos/Doug-Lyons/reactos/issues/comments{/number}","contents_url":"https://api.github.com/repos/Doug-Lyons/reactos/contents/{+path}","compare_url":"https://api.github.com/repos/Doug-Lyons/reactos/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Doug-Lyons/reactos/merges","archive_url":"https://api.github.com/repos/Doug-Lyons/reactos/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Doug-Lyons/reactos/downloads","issues_url":"https://api.github.com/repos/Doug-Lyons/reactos/issues{/number}","pulls_url":"https://api.github.com/repos/Doug-Lyons/reactos/pulls{/number}","milestones_url":"https://api.github.com/repos/Doug-Lyons/reactos/milestones{/number}","notifications_url":"https://api.github.com/repos/Doug-Lyons/reactos/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Doug-Lyons/reactos/labels{/name}","releases_url":"https://api.github.com/repos/Doug-Lyons/reactos/releases{/id}","deployments_url":"https://api.github.com/repos/Doug-Lyons/reactos/deployments","created_at":"2017-12-28T06:37:43Z","updated_at":"2017-12-28T06:38:52Z","pushed_at":"2018-02-12T10:10:40Z","git_url":"git://github.com/Doug-Lyons/reactos.git","ssh_url":"git@github.com:Doug-Lyons/reactos.git","clone_url":"https://github.com/Doug-Lyons/reactos.git","svn_url":"https://github.com/Doug-Lyons/reactos","homepage":null,"size":463082,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"reactos:master","ref":"master","sha":"a3403eff05288c09ee744181e5a59149fac728ad","user":{"login":"reactos","id":1056157,"avatar_url":"https://avatars0.githubusercontent.com/u/1056157?v=4","gravatar_id":"","url":"https://api.github.com/users/reactos","html_url":"https://github.com/reactos","followers_url":"https://api.github.com/users/reactos/followers","following_url":"https://api.github.com/users/reactos/following{/other_user}","gists_url":"https://api.github.com/users/reactos/gists{/gist_id}","starred_url":"https://api.github.com/users/reactos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/reactos/subscriptions","organizations_url":"https://api.github.com/users/reactos/orgs","repos_url":"https://api.github.com/users/reactos/repos","events_url":"https://api.github.com/users/reactos/events{/privacy}","received_events_url":"https://api.github.com/users/reactos/received_events","type":"Organization","site_admin":false},"repo":{"id":105627846,"name":"reactos","full_name":"reactos/reactos","owner":{"login":"reactos","id":1056157,"avatar_url":"https://avatars0.githubusercontent.com/u/1056157?v=4","gravatar_id":"","url":"https://api.github.com/users/reactos","html_url":"https://github.com/reactos","followers_url":"https://api.github.com/users/reactos/followers","following_url":"https://api.github.com/users/reactos/following{/other_user}","gists_url":"https://api.github.com/users/reactos/gists{/gist_id}","starred_url":"https://api.github.com/users/reactos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/reactos/subscriptions","organizations_url":"https://api.github.com/users/reactos/orgs","repos_url":"https://api.github.com/users/reactos/repos","events_url":"https://api.github.com/users/reactos/events{/privacy}","received_events_url":"https://api.github.com/users/reactos/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/reactos/reactos","description":"A free Windows-compatible Operating System","fork":false,"url":"https://api.github.com/repos/reactos/reactos","forks_url":"https://api.github.com/repos/reactos/reactos/forks","keys_url":"https://api.github.com/repos/reactos/reactos/keys{/key_id}","collaborators_url":"https://api.github.com/repos/reactos/reactos/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/reactos/reactos/teams","hooks_url":"https://api.github.com/repos/reactos/reactos/hooks","issue_events_url":"https://api.github.com/repos/reactos/reactos/issues/events{/number}","events_url":"https://api.github.com/repos/reactos/reactos/events","assignees_url":"https://api.github.com/repos/reactos/reactos/assignees{/user}","branches_url":"https://api.github.com/repos/reactos/reactos/branches{/branch}","tags_url":"https://api.github.com/repos/reactos/reactos/tags","blobs_url":"https://api.github.com/repos/reactos/reactos/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/reactos/reactos/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/reactos/reactos/git/refs{/sha}","trees_url":"https://api.github.com/repos/reactos/reactos/git/trees{/sha}","statuses_url":"https://api.github.com/repos/reactos/reactos/statuses/{sha}","languages_url":"https://api.github.com/repos/reactos/reactos/languages","stargazers_url":"https://api.github.com/repos/reactos/reactos/stargazers","contributors_url":"https://api.github.com/repos/reactos/reactos/contributors","subscribers_url":"https://api.github.com/repos/reactos/reactos/subscribers","subscription_url":"https://api.github.com/repos/reactos/reactos/subscription","commits_url":"https://api.github.com/repos/reactos/reactos/commits{/sha}","git_commits_url":"https://api.github.com/repos/reactos/reactos/git/commits{/sha}","comments_url":"https://api.github.com/repos/reactos/reactos/comments{/number}","issue_comment_url":"https://api.github.com/repos/reactos/reactos/issues/comments{/number}","contents_url":"https://api.github.com/repos/reactos/reactos/contents/{+path}","compare_url":"https://api.github.com/repos/reactos/reactos/compare/{base}...{head}","merges_url":"https://api.github.com/repos/reactos/reactos/merges","archive_url":"https://api.github.com/repos/reactos/reactos/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/reactos/reactos/downloads","issues_url":"https://api.github.com/repos/reactos/reactos/issues{/number}","pulls_url":"https://api.github.com/repos/reactos/reactos/pulls{/number}","milestones_url":"https://api.github.com/repos/reactos/reactos/milestones{/number}","notifications_url":"https://api.github.com/repos/reactos/reactos/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/reactos/reactos/labels{/name}","releases_url":"https://api.github.com/repos/reactos/reactos/releases{/id}","deployments_url":"https://api.github.com/repos/reactos/reactos/deployments","created_at":"2017-10-03T08:04:52Z","updated_at":"2018-02-17T05:45:22Z","pushed_at":"2018-02-16T23:50:44Z","git_url":"git://github.com/reactos/reactos.git","ssh_url":"git@github.com:reactos/reactos.git","clone_url":"https://github.com/reactos/reactos.git","svn_url":"https://github.com/reactos/reactos","homepage":null,"size":463254,"stargazers_count":3225,"watchers_count":3225,"language":"C","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":207,"mirror_url":null,"archived":false,"open_issues_count":44,"license":null,"forks":207,"open_issues":44,"watchers":3225,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/reactos/reactos/pulls/373"},"html":{"href":"https://github.com/reactos/reactos/pull/373"},"issue":{"href":"https://api.github.com/repos/reactos/reactos/issues/373"},"comments":{"href":"https://api.github.com/repos/reactos/reactos/issues/373/comments"},"review_comments":{"href":"https://api.github.com/repos/reactos/reactos/pulls/373/comments"},"review_comment":{"href":"https://api.github.com/repos/reactos/reactos/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/reactos/reactos/pulls/373/commits"},"statuses":{"href":"https://api.github.com/repos/reactos/reactos/statuses/c6c9b1b1de6e1a53b4cac7de42bb191a691ddfd8"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Doug-Lyons"}}