日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

用汇编写系统服务程序

發布時間:2025/3/15 windows 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用汇编写系统服务程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用匯編寫系統服務程序
本想寫一篇關于服務的文章,結果搜了一遍以后,發現發表于天極網上的一篇文章《Win32程序設計之服務》把要說的大部分東西都說了,為了不做重復勞動,所以在這里首先引用這篇文章來說明服務程序的原理,在后面的補充一節中再補上一些內容和一個用匯編實現服務的源代碼。

======================================================================
第一部分:轉載《Win32程序設計之服務》

原始位置:http://www.chinabyte.com/20010528/181751.shtml
======================================================================

每個操作系統都需要有在后臺執行任務的方法,無論是誰正在使用這部機器,這些任務都可以繼續運行,后臺任務可以處理各種重要的服務,包括系統的或者用戶的。例如,一個信使服務可以監控網絡,并且在接收到另一臺機子的信息時,可以顯示一個對話框。一個發送和接收傳真的應用需要在啟動的時候運行,并且不斷地監控負責傳真的modem,看有沒有傳真進來。一個家庭的或者辦公室的安全程序,用來控制一件檢測設備時,它需要不時地查詢傳感器,并且在適當的時候響應它。所有這些任務都需要CPU時間來執行它們,不過由于它們需要的CPU時間很少,因此可以放在后臺而不影響用戶使用系統。

  在MS-DOS中,后臺的任務是通過TSR(Terminate and Stay Resident)程序來處理的。這些程序經由autoexec.bat文件開始。在UNIX中,后臺任務是通過Daemons來處理的。在每次啟動UNIX的過程中,你都可以看到操作系統啟動一些任務,例如定時的程序(Cron)和Finger的daemons,然后才可以讓首個用戶登錄。在Windows NT中,后臺的任務被稱為服務。服務可在每次NT啟動的時候運行,并且不管是誰登陸,都會一直運行下去。

  Windows NT的服務都是通過一般的可執行程序實現的,不同的是,它遵循內部的一個特定協議來設計,以便它們能夠與服務控制管理器(SCM,Service Control Manager)進行正確的交互。在這篇文章中,你將學習到如何在Windows NT中創建和安裝簡單的Win32服務。一旦你懂得了這個簡單的服務,你要建立自己的服務也不難了,因為所有的服務,不論是如何地復雜,都必須包含有同樣基本的SCM接口代碼。只要符合SCM的要求,其實為服務設計的可執行文件和一般的程序并沒有多少的區別。

  無論是對于編程者或者系統管理員,了解NT的服務如何工作都是很重要的。編程者就不必說了,因為他們要創建自己的服務,而對于系統管理員,也是同樣重要的。因為后臺的任務可以是很危險的。MS-DOS和Macintosh系統都是一個病毒的溫床,因為它們在安全性方面先天不足,它們都可以允許任何人或者程序在任何時間創建后臺的任務。Windows NT和UNIX系統是較安全的,因為只有系統管理員才可以為系統增加后臺的任務,不過,如果系統管理員加入了一個破壞性的后臺程序,就它就可以為所欲為了。因此系統管理員要了解Windows NT服務的技巧和權限設置,就可以避免加入有潛在危險的后臺任務。

基本的概念

  服務有兩種不同的形式。驅動器服務使用驅動器協議,讓NT可以與特定的硬件進行通信。另一個是Win32服務,通過一般的Win32 API來實現后臺任務。這篇文章的重點是談Win32服務,因為它們更為常見,而且創建起來也很容易。任何的NT編程者通過使用一般的NT SDK(或者Visual C++),并且可以用管理員的身份訪問一臺NT機器,都可以實現和安裝自己的Win32服務。如果你想創建一些在Windows NT啟動時就運行的程序,并且要求它會在系統中一直運行,你就要使用Win32的服務。

  在NT中,服務通過控制面板進行管理。在控制面板中,你會發現有一個服務的圖標,打開它你會看到所有Win32服務的清單。在那里你可以開始、停止、暫停和繼續某個服務。你按下其中的啟動按鈕后,就會出現一個對話框,你可以修改啟動操作以及服務使用的默認帳號。一個服務可以在系統啟動的時候自動運行,也可以被完全禁止。或者設置為手動執行。在手動的時候,用戶還可以設置啟動的參數。要對服務中的項目作修改的話,你需要以一個管理員或者超級用戶的身份登錄。

  Windows NT自帶有一些預裝的任務,用來處理諸如網絡信使服務的操作或者使用“at”命令定時執行的操作,以及分布的RPC命名。在你創建自己的服務時,你必須執行一個獨立的安裝步驟,以將服務的信息插入到服務管理工具的列表中,這些信息包括有新服務的名字、執行文件的名字和啟動的類型等,都會寫入到注冊表中,這樣在機器下次啟動的時候,SCM就會得到新服務的相關信息。

創建一個新的服務

  執行服務的程序也是一個EXE文件,不過它必須符合某些特定的規范,以便可以與SCM進行正確的交互。微軟很細致地設計了函數調用的流程,你必須遵循這些流程,否則你的服務就不能工作。具體的規定如下所列。你可以在Win32編程者的參考指南中找到以下涉及的函數,這些資料在SDK的Win32在線幫助或者Visual C++都有:

   .服務的代碼必須要有一個一般的main或者WinMain函數。這個函數應該會馬上調用StartServiceCrtlDispatcher函數。通過調用這個函數,你可以讓SCM得到ServiceMain函數的指針,這樣在SCM要啟動該服務時,就可以調用它

   .在SCM要啟動服務的時候,就會調用ServiceMain函數。例如,如果管理員在服務管理器中按下啟動的按鈕,SCM就會在一個獨立的線程中執行ServiceMain函數。ServiceMain應該調用RegisterServiceCtrlHandler函數,這樣可以注冊一個Handler函數,以便SCM對服務進行控制。Handler函數的名字可以是任意的,不過它會在Handler下的文檔中列出來。RegisterServiceCtrlHandler函數會返回一個句柄,在服務需要發送狀態信息給SCM時,可以通過該句柄進行。

   .ServiceMain函數也必須啟動做該服務實際工作的線程。在服務停止前,ServiceMain函數是不應該有返回的。當它返回的時候,服務已經停止了。

   .Handler函數包含了一個switch語句,用來分析由SCM傳送過來的請求。默認的情況,SCM可以發送以下任何的的控制常數:

     SERVICE_CONTROL_STOP - 要服務停止
     SERVICE_CONTROL_PAUSE - 要服務暫停
     SERVICE_CONTROL_CONTINUE - 要服務繼續
     SERVICE_CONTROL_INTERROGATE - 要服務馬上報告它的狀態
     SERVICE_CONTROL_SHUTDOWN - 告訴服務即將關機

  也可以創建自定義的常數(值在128到255之間),并且通過SCM發送給服務。

  如果你創建的EXE包括有以上提到的main、ServiceMain和Handler函數,以及執行服務自身任務的線程函數,那么你的服務程序設計就完成了。以下的圖總結了這些不同的函數和SCM之間的交互:

  在本文的最后還有幾段程序的列表,其中列表一為我們展示了一個可能是最簡單的服務。該服務只發出"嘟"的響聲。默認的狀態下,它每兩秒響一次。你可以通過啟動的參數來修改發聲的間隔。這個服務挺完整,它可以正確響應SCM傳來的每個控制信號。因此,這個程序可作為你創建自己服務的一個很好的模板。

  main函數通過調用StartServiceCtrlDispatcher來注冊ServiceMain函數。注冊的操作使用了一個SERVICE_TABLE_ENTRY結構的數組。在這個例子中,該程序只包含了一個服務,因此在表中只會有一個項目。不過,對于一個EXE文件,可以創建幾個任務,這樣在表中就會有幾項,以識別不同的ServiceMain函數。在調用StartServiceCtrlDispatcher之前,可在main函數中放入初始化的代碼,不過這些代碼必須在少于30秒內完成,否則,SCM會認為某些地方出錯而終止服務。

  在自動或者手動啟動服務時,將會調用ServiceMain函數。ServiceMain函數將包含有以下的步驟:

  1.它馬上調用RegisterServiceCtrlHandler來注冊Handler函數,作為SCM控制該服務的Handler函數

  2.然后它將調用SendStatusToSCM函數,將當前的進程通報給SCM。第四個參數是一個“click count”值,在程序每次更新狀態時,它的值就會增加。SCM和其它的程序可以根據click count的值來知道初始化期間進行的處理。最后的參數是"wait hint",是用來告訴SCM在click count下次更新前,它需要等待的時間(以毫秒計算)。

  3.ServiceMain接著會創建一個事情,該事件在函數的底部使用,可讓它一直運行,直到SCM發出一個STOP的請求。

  4.接著,ServiceMain檢查啟動的參數。參數可在用戶手動啟動服務時,通過服務管理工具中的啟動參數傳送過來。這些參數以一個argv形式的數組進入ServiceMain函數。

  5.如果你的服務需要處理其它初始化的任務,它們應該放在這一步,在調用InitService之前。

  6.ServiceMain函數接著調用InitService函數,這將啟動線程并做服務的真正工作。如果該調用成功,SverviceMain將會通知SCM服務已經成功啟動。

  7.ServiceMain將調用WaitForSingleObject,用來等待terminateEvent事件對象被設置。這個對象通過Handler函數設置,一旦它被設置,ServiceMain將調用終止的函數來做清除的工作,然后就返回并停止服務。

  你從上面可以看到,在這個函數中并沒有多少靈活的地方。除了第5步外,你必須按步執行以上提到的任務,否則服務將不可以正確啟動。

  終止函數清除所有打開的句柄,并且發送一個狀態的信息給SCM,告訴它服務現已停止。

  在SCM要暫停、繼續、詢問或者停止服務時,它就會調用Handler函數。要停止服務,Handler設置terminateEvent,這樣做會導致ServiceMain(它會以一個獨立線程的形式執行)終止并且返回。一旦ServiceMain返回,服務就停止了。

  SendStatusToSCM 函數負責發送服務的當前狀態給SCM。

  在需要啟動服務線程時,ServiceMain就會調用InitService函數。該函數調用CreateThread來為服務創建一個新的線程。

  ServiceThread函數包含有該服務真正要做的工作。在這個例子中,該線程包含有一個無限的循環,以一個預定義的時間間隔發出響聲。在你創建自己的服務時,你可以在該線程中放入任何的代碼,調用Win32函數或者你自己的函數。

安裝和移除服務

  為了使用上面提到的發響聲服務,你必須安裝它。安裝可讓SCM知道這個服務,并且讓SCM將它加入到控制面板中的服務列表中。表單二的代碼展示了如何安裝一個服務。

  表單2先通過OpenSCManager函數打開一個到SCM的連接。在OpenSCManager的調用中,你必須指定你要做的東西,以便SCM可以驗證這個行為。如果你登錄的帳號沒有足夠的權限,該調用將返回NULL。

  CreateService的調用是真正用來裝入新服務的。它使用OpenSCManager返回至SCM的指針、名字、標簽和命令行中的EXE文件,還有一些標準的參數值。使用SERVICE_WIN32_OWN_PROCESS表明該服務的EXE文件只包含有一個服務,而SERVICE_DEMAND_START則表明該服務是手動而不是自動啟動的。使用命令行安裝程序的一個典型格式如下:

   install BeepService "Beeper" c:/winnt/beep.exe

  第一個參數是SCM內部使用的服務名字。這個名字也用在以后移除服務。第二個參數是一個標識符,即服務管理中顯示的名字。第三個參數指出該服務的執行文件的路徑。在你安裝服務后,可在控制面板的服務管理中啟動它。如果有錯,可在Win32 API的在線文檔中查出錯誤代碼的含義。

  要移除服務,你要按列表3的步驟進行。它首先打開一個到SCM的連接,然后使用OpenService函數打開一個與服務的連接。列表3中接著查詢服務來看它是否現已停止了。如果不是的話,就會停止它。DeleteService 用來從控制面板中移除服務,移除操作的典型格式如下:

  remove BeepService

  需要的話,你也可以在馬上重新安裝服務。

結論

  服務對于Windows NT是很重要的一部分,因為它可讓你對操作系統進行擴展。使用列表1的代碼作為一個模板,你將會發現要建立一個自己的新服務是非常簡單的。

  列表1

  實現可能是最簡單NT服務的代碼


//***************************************************************
// From the book "Win32 System Services: The Heart of Windows NT"
// by Marshall Brain
// Published by Prentice Hall
file://
// This code implements the simplest possible service.
// It beeps every 2 seconds, or at a user specified interval.
file://***************************************************************

// beepserv.cpp

#include
#include
#include
#include

#define DEFAULT_BEEP_DELAY 2000

// Global variables

// The name of the service
char *SERVICE_NAME = "BeepService";
// Event used to hold ServiceMain from completing
HANDLE terminateEvent = NULL;
// Handle used to communicate status info with
// the SCM. Created by RegisterServiceCtrlHandler
SERVICE_STATUS_HANDLE serviceStatusHandle;
// The beep interval in ms.
int beepDelay = DEFAULT_BEEP_DELAY;
// Flags holding current state of service
BOOL pauseService = FALSE;
BOOL runningService = FALSE;
// Thread for the actual work
HANDLE threadHandle = 0;

void ErrorHandler(char *s, DWORD err)
{
cout s endl;
cout "Error number: " err endl;
ExitProcess(err);
}

// This function consolidates the activities of
// updating the service status with
// SetServiceStatus
BOOL SendStatusToSCM (DWORD dwCurrentState,
DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode,
DWORD dwCheckPoint,
DWORD dwWaitHint)
{
BOOL success;
SERVICE_STATUS serviceStatus;

// Fill in all of the SERVICE_STATUS fields
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState = dwCurrentState;

// If in the process of doing something, then accept
// no control events, else accept anything
if (dwCurrentState == SERVICE_START_PENDING)
serviceStatus.dwControlsAccepted = 0;
else
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_PAUSE_CONTINUE |
SERVICE_ACCEPT_SHUTDOWN;

// if a specific exit code is defined, set up
// the win32 exit code properly
if (dwServiceSpecificExitCode == 0)
serviceStatus.dwWin32ExitCode = dwWin32ExitCode;
else
serviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
serviceStatus.dwServiceSpecificExitCode =dwServiceSpecificExitCode;
serviceStatus.dwCheckPoint = dwCheckPoint;
serviceStatus.dwWaitHint = dwWaitHint;

// Pass the status record to the SCM
success = SetServiceStatus (serviceStatusHandle, &serviceStatus);
return success;
}

DWORD ServiceThread(LPDWORD param)
{
while (1)
{
Beep(200,200);
Sleep(beepDelay);
}
return 0;
}

// Initializes the service by starting its thread
BOOL InitService()
{
DWORD id;

// Start the service's thread
threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE) ServiceThread,0, 0, &id);

if (threadHandle==0)
return FALSE;
else
{
runningService = TRUE;
return TRUE;
}
}

// Dispatches events received from the SCM
VOID Handler (DWORD controlCode)
{
DWORD currentState = 0;
BOOL success;

switch(controlCode)
{
// There is no START option because
// ServiceMain gets called on a start

// Stop the service
case SERVICE_CONTROL_STOP:
// Tell the SCM what's happening
success = SendStatusToSCM(SERVICE_STOP_PENDING,NO_ERROR, 0, 1, 5000);
runningService=FALSE;
// Set the event that is holding ServiceMain
// so that ServiceMain can return
SetEvent(terminateEvent);
return;
// Pause the service
case SERVICE_CONTROL_PAUSE:
if (runningService && !pauseService)
{
// Tell the SCM what's happening
success = SendStatusToSCM(SERVICE_PAUSE_PENDING,
NO_ERROR, 0, 1, 1000);
pauseService = TRUE;
SuspendThread(threadHandle);
currentState = SERVICE_PAUSED;
}
break;
// Resume from a pause
case SERVICE_CONTROL_CONTINUE:
if (runningService && pauseService)
{
// Tell the SCM what's happening
success = SendStatusToSCM(SERVICE_CONTINUE_PENDING,
NO_ERROR, 0, 1, 1000);
pauseService=FALSE;
ResumeThread(threadHandle);
currentState = SERVICE_RUNNING;
}
break;
// Update current status
case SERVICE_CONTROL_INTERROGATE:
// it will fall to bottom and send status
break;
// Do nothing in a shutdown. Could do cleanup
// here but it must be very quick.
case SERVICE_CONTROL_SHUTDOWN:
return;
default:
break;
}
SendStatusToSCM(currentState, NO_ERROR, 0, 0, 0);
}

// Handle an error from ServiceMain by cleaning up
// and telling SCM that the service didn't start.
VOID terminate(DWORD error)
{
// if terminateEvent has been created, close it.
if (terminateEvent) CloseHandle(terminateEvent);

// Send a message to the scm to tell about stopage
if (serviceStatusHandle)
SendStatusToSCM(SERVICE_STOPPED, error,0, 0, 0);

// If the thread has started, kill it off
if (threadHandle) CloseHandle(threadHandle);

// Do not need to close serviceStatusHandle
}

// ServiceMain is called when the SCM wants to
// start the service. When it returns, the service
// has stopped. It therefore waits on an event
// just before the end of the function, and
// that event gets set when it is time to stop.
// It also returns on any error because the
// service cannot start if there is an eror.
VOID ServiceMain(DWORD argc, LPTSTR *argv)
{
BOOL success;

// immediately call Registration function
serviceStatusHandle =
RegisterServiceCtrlHandler(
SERVICE_NAME, (LPHANDLER_FUNCTION)Handler);
if (!serviceStatusHandle) {terminate(GetLastError()); return;}

// Notify SCM of progress
success = SendStatusToSCM(SERVICE_START_PENDING,
NO_ERROR, 0, 1, 5000);
if (!success) {terminate(GetLastError()); return;}

// create the termination event
terminateEvent = CreateEvent (0, TRUE, FALSE, 0);
if (!terminateEvent) {terminate(GetLastError()); return;}

// Notify SCM of progress
success = SendStatusToSCM(SERVICE_START_PENDING,
NO_ERROR, 0, 2, 1000);
if (!success) {terminate(GetLastError()); return;}

// Check for startup params
if (argc == 2)
{
int temp = atoi(argv[1]);
if (temp 1000)
beepDelay = DEFAULT_BEEP_DELAY;
else
beepDelay = temp;
}

// Notify SCM of progress
success = SendStatusToSCM(SERVICE_START_PENDING,
NO_ERROR, 0, 3, 5000);
if (!success) {terminate(GetLastError()); return;}

// Start the service itself
success = InitService();
if (!success) {terminate(GetLastError()); return;}

// The service is now running.
// Notify SCM of progress
success = SendStatusToSCM(SERVICE_RUNNING,
NO_ERROR, 0, 0, 0);
if (!success) {terminate(GetLastError()); return;}

// Wait for stop signal, and then terminate
WaitForSingleObject (terminateEvent, INFINITE);

terminate(0);
}

VOID main(VOID)
{
SERVICE_TABLE_ENTRY serviceTable[] =
{
{ SERVICE_NAME,
(LPSERVICE_MAIN_FUNCTION) ServiceMain},
{ NULL, NULL }
};
BOOL success;

// Register with the SCM
success =
StartServiceCtrlDispatcher(serviceTable);
if (!success)
ErrorHandler("In StartServiceCtrlDispatcher",
GetLastError());
}

列表2
安裝NT服務的代碼


file://***************************************************************
// From the book "Win32 System Services: The Heart of Windows NT"
// by Marshall Brain
// Published by Prentice Hall
file://
// This code installs a service.
file://***************************************************************

// install.cpp

#include
#include

void ErrorHandler(char *s, DWORD err)
{
cout s endl;
cout "Error number: " err endl;
ExitProcess(err);
}

void main(int argc, char *argv[])
{
SC_HANDLE newService, scm;

if (argc != 4)
{
cout "Usage:/n";
cout " install service_name /
service_label executable/n";
cout " service_name is the /
name used internally by the SCM/n";
cout " service_label is the /
name that appears in the Services applet/n";
cout " (for multiple /
words, put them in double quotes)/n";
cout " executable is the /
full path to the EXE/n/n";
return;
}

// open a connection to the SCM
scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
if (!scm) ErrorHandler("In OpenScManager",
GetLastError());

// Install the new service
newService = CreateService(
scm, argv[1], // eg "beep_srv"
argv[2], // eg "Beep Service"
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
argv[3], // eg "c:/winnt/xxx.exe"
0, 0, 0, 0, 0);
if (!newService) ErrorHandler("In CreateService",
GetLastError());
else cout "Service installed/n";

// clean up
CloseServiceHandle(newService);
CloseServiceHandle(scm);
}

列表3
移除NT服務的代碼
file://***************************************************************
// From the book "Win32 System Services: The Heart of Windows NT"
// by Marshall Brain
// Published by Prentice Hall
file://
// This code removes a service from the Services applet in the
// Control Panel.
file://***************************************************************

// remove.cpp

#include
#include

void ErrorHandler(char *s, DWORD err)
{
cout s endl;
cout "Error number: " err endl;
ExitProcess(err);
}

void main(int argc, char *argv[])
{
SC_HANDLE service, scm;
BOOL success;
SERVICE_STATUS status;

if (argc != 2)
{
cout "Usage:/n remove service_name/n";
return;
}

// Open a connection to the SCM
scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
if (!scm) ErrorHandler("In OpenScManager",
GetLastError());

// Get the service's handle
service = OpenService(scm, argv[1],
SERVICE_ALL_ACCESS | DELETE);
if (!service) ErrorHandler("In OpenService",
GetLastError());

// Stop the service if necessary
success = QueryServiceStatus(service, &status);
if (!success) ErrorHandler("In QueryServiceStatus",
GetLastError());
if (status.dwCurrentState != SERVICE_STOPPED)
{
cout "Stopping service.../n";
success = ControlService(service,
SERVICE_CONTROL_STOP, &status);
if (!success) ErrorHandler("In ControlService",
GetLastError());
}

// Remove the service
success = DeleteService(service);
if (success) cout "Service removed/n";
else ErrorHandler("In DeleteService",
GetLastError());

// Clean up
CloseServiceHandle(service);
CloseServiceHandle(scm);
}


======================================================================
第二部分:用Win32匯編實現系統服務
by:羅云彬

好了,經過了上面這篇文章,大家對服務應該有個初步的了解了,但是要注意分辨文章中提及的 API 名稱和程序自己的模塊名稱,比如CreateService是一個 API,而 ServiceMain 是程序中一個子程序的名稱,千萬不要把子程序名當系統的 API 去使用了 :)
在這部分的補充中,我再歸納一下實現各種功能所使用的 API 函數名和使用的步驟,并提供一個匯編源程序例子來供大家參考,大家也可以下載整個源代碼包并修改使用。
一般來說,整個服務程序系統由兩個單獨的程序組成:服務程序和服務控制程序,經過了上面的介紹,大家一定明白這兩個程序應該由哪些部分組成了:

服務程序的結構

服務程序是被用來實現服務功能的部分,它由相對獨立的3個部分組成:

1. 程序入口 -> 調用StartServiceCtrlDispatcher(注冊服務主程序)
2. 服務主程序(被SCM調用)-> 調用RegisterServiceCtrlHandler(注冊控制handler)-> 調用 SetServiceStatus 設置服務的正確狀態 -> 執行服務的功能代碼 -> 需要結束服務的時候則返回。
3. 控制Handler -> 設置內部標志以控制第2部分服務主程序中的代碼走向,并調用 SetServiceStatus 更新服務的狀態。

可見,服務程序必須用到的 API 只有 StartServiceCtrlDispatcher、RegisterServiceCtrlHandler和SetServiceStatus ,其余的大部分代碼是執行本身的功能模塊。這里有一個服務程序的簡單例子,實現的是每秒種讓喇叭發聲一次的功能。

下面的源代碼是 Service.asm 程序:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Windows NT 服務程序模板
; by 羅云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服務端程序 Ver 1.0
;
; 2002.06.20 ----- 第1版
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include AdvApi32.inc
includelib AdvApi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 數據段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?

stSS SERVICE_STATUS > ;服務的狀態
hSS dd ? ;服務的狀態句柄
dwOption dd ?
F_STOP equ 0001h ;停止服務

include
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代碼段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服務控制程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcHandler proc _dwControl

pushad
mov eax,_dwControl
.if eax == SERVICE_CONTROL_STOP
or dwOption,F_STOP
mov stSS.dwCurrentState,SERVICE_STOPPED
invoke SetServiceStatus,hSS,addr stSS
.elseif eax == SERVICE_CONTROL_INTERROGATE
invoke SetServiceStatus,hSS,addr stSS
.endif
popad
ret

_ProcHandler endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服務主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ServiceMain proc _dwArgc,_lpszArgv

pushad
invoke RegisterServiceCtrlHandler,addr szServiceName,offset _ProcHandler
mov hSS,eax
mov stSS.dwServiceType,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS
mov stSS.dwCurrentState,SERVICE_START_PENDING
mov stSS.dwControlsAccepted,SERVICE_ACCEPT_STOP
mov stSS.dwWin32ExitCode,NO_ERROR
invoke SetServiceStatus,hSS,addr stSS
;********************************************************************
; 如果初始化代碼比較多,那么需要首先把狀態設置為 pending,等完成以后
; 再設置為 Running。(在這里加入初始化代碼)
;********************************************************************
mov stSS.dwCurrentState,SERVICE_RUNNING
invoke SetServiceStatus,hSS,addr stSS
;********************************************************************
; 服務的具體執行代碼
; 在這里是每隔1秒種讓喇叭發聲
;********************************************************************
.repeat
invoke MessageBeep,-1
invoke Sleep,1000
.until dwOption & F_STOP
popad
ret

_ServiceMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stSTE[2]:SERVICE_TABLE_ENTRY

invoke RtlZeroMemory,addr @stSTE,sizeof @stSTE
mov @stSTE[0].lpServiceName,offset szServiceName
mov @stSTE[0].lpServiceProc,offset _ServiceMain
invoke StartServiceCtrlDispatcher,addr @stSTE
ret

_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

這里是服務名稱的定義文件 Define.inc,這個文件已經在前面用include語句包含進來:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 公用文本信息
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const

szServiceEXE db 'Service.exe',0 ;在這里定義運行服務的 exe 文件名
szServiceName db 'ServiceTemplate',0 ;在這里定義服務的名稱
szDisplayName db 'Service Template for test',0 ;在這里定義服務顯示的名稱
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


要注意的是,服務程序部分的代碼并沒有什么靈活性可言,它必須按照這樣的步驟來實現,否則Windows就不認為它是一個服務程序了,另外,需要補充說明的是:

1. StartServiceCtrlDispatcher 函數被調用后并不馬上返回,這時系統會去調用服務主程序(上面的_ServiceMain子程序),只有當服務主程序返回的時候,函數才會返回,這時主程序繼續執行并執行 ExitProcess 終止執行。
2. 從第1點可以發現:在服務程序中,服務主程序的退出就意味著服務自行終止了,所以假如程序創建了多個線程來執行功能代碼的話,在線程被創建以后,主程序還需要在這里等待,否則子程序返回以后服務進程就結束了,這些線程又怎么能繼續執行呢?

服務控制程序的結構

好了,有了服務程序以后,還需要把服務正確安裝才能讓它運行,這個工作就是服務控制程序的事情了,一般來說,服務控制程序的結構并沒有什么特殊的要求,它只是一個普通的Win32可執行文件而已,在服務控制程序中可以使用下面的 API 來進行各種控制,這些 API的具體語法請查看 Win32 API 手冊:

1. 在進行和服務相關的各種操作之前,必須使用OpenSCManager來聯系服務管理器,并從這個 API 得到一個
服務管理器的句柄 hSCM。
2. 操作某個具體的服務前,需要使用OpenService來打開服務,并得到服務的句柄hService,接下來就可以使用這個句柄來控制服務(當然,安裝服務的時候并不需要此步驟,這時服務還不存在呢,又如何打開?)
3. 安裝服務:使用 CreateService 函數,這個函數將服務程序的可執行文件在SCM中注冊,注意:“注冊”并不意味著執行,它只是在SCM的數據庫中登記一條包含可執行文件名、啟動方式、服務名稱等信息的數據而已,執行這個函數以后,在控制面板的服務一欄中就可以看到服務列表中已經出現這個服務了,由于這僅僅是“注冊”,所以系統并不檢查可執行文件的合法性,也就是說,即使注冊一個不存在的可執行文件,注冊操作仍然會成功,但這樣以后要啟動服務的時候就會失敗。注冊過一次以后,SCM數據庫中的信息會被自動保存,所以“注冊”操作是一次性的過程,并不需要在每次啟動服務的時候都去注冊一遍。
4. 啟動服務:當安裝了服務以后,可以用StartService函數來啟動服務,這時系統才真正根據注冊的文件名去執行服務程序。
5. 刪除服務:刪除服務是安裝服務的逆過程,也就是在SCM的數據庫中將服務程序的信息刪除,刪除服務使用DeleteService函數。
6. 服務的控制:服務的暫停、停止等工作都可以由服務控制函數ControlService來完成,需要的僅僅是指定不同的參數而已。
7. 服務狀態的查詢可以由QueryServiceStatus函數來完成。
8. 句柄的關閉:和上面的操作相關的句柄(包括SCM句柄和服務句柄)在不再使用以后需要用CloseServiceHandle函數關閉。

下面的幾個子程序舉例說明了安裝服務、刪除服務、啟動服務和停止服務的操作方法,注意子程序中用到的hSCM已經在其他地方首先調用OpenSCManager函數獲取了。更具體的源代碼請查看文章附帶的源代碼包中的Control.asm文件。


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 安裝服務
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_InstallService proc
local @hService,@dwReturn

mov @dwReturn,FALSE
;********************************************************************
; 創建服務
;********************************************************************
invoke CreateService,hSCM,addr szServiceName,addr szDisplayName,/
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,/
SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,addr szServiceFile,/
NULL,NULL,NULL,NULL,NULL
.if ! eax
invoke GetLastError
.if eax == ERROR_DUP_NAME || eax == ERROR_SERVICE_EXISTS
mov @dwReturn,TRUE
.else
mov @dwReturn,FALSE
.endif
jmp @F
.endif
mov @hService,eax
mov @dwReturn,TRUE
;********************************************************************
invoke CloseServiceHandle,@hService
@@:
mov eax,@dwReturn
ret

_InstallService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 刪除服務
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DeleteService proc
local @hService,@dwReturn
local @stStatus:SERVICE_STATUS

mov @dwReturn,FALSE
;********************************************************************
; 打開服務
;********************************************************************
invoke OpenService,hSCM,addr szServiceName,SERVICE_ALL_ACCESS
.if ! eax
jmp @F
.endif
mov @hService,eax
;********************************************************************
; 停止服務并刪除服務
;********************************************************************
call _StopService
invoke DeleteService,@hService
.if eax
mov @dwReturn,TRUE
.endif
invoke CloseServiceHandle,@hService
@@:
mov eax,@dwReturn
ret

_DeleteService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 啟動服務
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_StartService proc
local @hService

invoke OpenService,hSCM,addr szServiceName,SERVICE_START
.if eax
mov @hService,eax
invoke StartService,@hService,0,NULL
.if eax
mov eax,TRUE
.else
mov eax,FALSE
.endif
push eax
invoke CloseServiceHandle,@hService
pop eax
.else
mov eax,FALSE
.endif
ret

_StartService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 停止服務
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_StopService proc
local @hService
local @stStatus:SERVICE_STATUS

invoke OpenService,hSCM,addr szServiceName,SERVICE_ALL_ACCESS
.if eax
mov @hService,eax
invoke QueryServiceStatus,@hService,addr @stStatus
invoke ControlService,@hService,SERVICE_CONTROL_STOP,addr @stStatus
.if eax
mov eax,TRUE
.else
mov eax,FALSE
.endif
push eax
invoke CloseServiceHandle,@hService
pop eax
.else
mov eax,FALSE
.endif
ret

_StopService endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


合并服務程序和服務控制程序

在上面的例子中,將服務程序和服務控制程序分開是為了更好地從概念上說明兩者的區別,但在實際應用中,還是有很多的程序將兩個部分合在同一個可執行文件中實現,這時兩部分僅僅是在物理上被放在同一個exe文件中,在結構上還是無不相干,完全獨立的。
雖然兩個部分的實現方式是完全不同的,但只要在程序的入口處就按照不同的情況去執行不同部分的代碼,將它們合在一個文件中還是可行的,其關鍵就是分辨程序被執行的時候是作為服務程序執行還是被作為服務控制程序執行的,常見的方法有:

1. 用命令行參數來分辨,使用CreateService函數安裝服務的時候遞交文件名字符串時可以在文件名后面跟參數,這樣程序入口處用GetCommandLine函數獲取命令行參數,檢測到特定參數則按照服務方式執行,否則按照服務控制程序方式運行。
2. 用運行路徑分辨,一些病毒程序初始化的時候將自己的副本拷貝到Windows目錄下并將這個副本注冊為服務,所以到它檢測到當前路徑是Windows目錄的時候,就按照服務方式運行。

總結

以上是生活随笔為你收集整理的用汇编写系统服务程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美 亚洲 另类 激情 另类 | 欧美一级黄色片 | 欧美日韩成人一区 | 欧美精品在线观看免费 | 天天色天天干天天色 | 在线观看成人毛片 | 免费观看全黄做爰大片国产 | 成人免费视频在线观看 | 日本黄区免费视频观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 天天爽综合网 | 毛片精品免费在线观看 | 午夜婷婷网 | 91人人视频在线观看 | av网站在线观看免费 | 手机看国产毛片 | 国产精品免费视频观看 | 久久久久9999亚洲精品 | 在线观看亚洲成人 | 色网站黄| 99久久国产免费,99久久国产免费大片 | 国产麻豆精品传媒av国产下载 | 日日躁夜夜躁aaaaxxxx | 96超碰在线 | 亚洲国内精品视频 | 日韩在线免费观看视频 | 午夜免费久久看 | 国内99视频 | 日韩欧美视频在线播放 | 国产亚洲免费的视频看 | 国产xx视频| 婷婷av网 | 日日操夜 | 中文字幕av在线电影 | 欧美精彩视频在线观看 | 玖玖爱在线观看 | 中国一级特黄毛片大片久久 | 久久亚洲免费 | 亚洲国产偷 | 91在线精品播放 | 天天干,天天射,天天操,天天摸 | 国产又粗又猛又黄又爽视频 | 精品播放 | 久草国产精品 | 日韩有码网站 | 亚洲国产资源 | 久久久午夜影院 | 在线观看色网站 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 欧美analxxxx | 日本精品视频一区二区 | 久草青青在线观看 | 久久国产精品免费看 | 91九色视频在线播放 | 亚洲无线视频 | 日本久久片 | 国产中的精品av小宝探花 | 国产亚洲一区 | 日韩一级精品 | 日韩在线电影 | 日韩综合在线观看 | 亚洲美女视频在线 | 久久国产免费 | 日韩免费播放 | 午夜电影一区 | 午夜久久久久久久久久久 | 亚欧洲精品视频在线观看 | 久久综合免费视频影院 | 久久不射网站 | 亚洲v精品| 香蕉视频色 | 亚洲视频精品在线 | 亚洲第一av在线播放 | 中文字幕首页 | 99热这里只有精品在线观看 | 亚洲精品中文字幕在线 | 免费不卡中文字幕视频 | 亚洲欧美成人综合 | 91香蕉视频 | 成人av在线播放网站 | 日日夜夜综合 | 欧美一性一交一乱 | 精品一区二三区 | 久久精品99视频 | 91最新网址在线观看 | 亚洲精选在线观看 | 一本到在线| 久艹在线播放 | 精品欧美一区二区三区久久久 | av大片网址 | 黄色网址国产 | 欧美日韩一区二区三区视频 | 麻豆免费视频观看 | 午夜免费电影院 | 操操操com | a极黄色片 | 精品国产一区二区三区av性色 | 亚洲三级在线播放 | 看av免费网站| 国产 在线 高清 精品 | 色综合久久久 | 久久99精品国产一区二区三区 | 免费三级骚 | 国产一级久久 | 成人午夜影视 | 精品产品国产在线不卡 | 在线免费国产视频 | 欧美午夜性 | 天天干天天干天天干 | 国内精自线一二区永久 | 欧美在线视频一区二区 | www.色午夜,com| 欧美日韩国产网站 | 国产在线不卡一区 | 国产精品久久久av | 黄色成人毛片 | 日韩精品一区二区三区第95 | 久久久久久久久久免费视频 | 色视频在线 | 天堂成人在线 | 99久久婷婷国产综合精品 | 91精品国产亚洲 | 日韩二区在线 | 在线直播av| 国产精品综合av一区二区国产馆 | 四虎免费av | 精品久久一二三区 | 国产精品一区二区三区在线播放 | 69av视频在线观看 | 97视频免费在线 | 激情开心网站 | 欧美91片 | 亚洲经典中文字幕 | 国产精品国产自产拍高清av | 久草久草久草久草 | 91久久国产露脸精品国产闺蜜 | 操操操日日日 | 91精品看片| 99久久久久久久 | 天天干天天上 | 人人干人人艹 | 久久精品一二区 | 国产a级精品| 视频精品一区二区三区 | 91福利免费 | 久久久国产网站 | 91福利在线观看 | 91爱看片 | 国产精品麻豆视频 | 天天干夜夜爽 | 97超视频 | 亚洲国产免费av | 欧美色综合久久 | 综合在线色 | 在线观看 国产 | 色橹橹欧美在线观看视频高清 | 日韩一级片观看 | 日韩在线观看第一页 | 亚洲v欧美v国产v在线观看 | 韩国视频一区二区三区 | 国产精品岛国久久久久久久久红粉 | 国产成人在线一区 | 毛片精品免费在线观看 | 欧美黑吊大战白妞欧美 | 伊人热| a亚洲视频| 亚洲乱码在线观看 | 天堂av网址| 日韩av网址在线 | 狠狠色噜噜狠狠狠合久 | 日批在线观看 | 视频国产区 | 色偷偷网站视频 | 91成人免费观看视频 | 免费成视频 | 国产女人18毛片水真多18精品 | 精品一区二区三区四区在线 | www国产亚洲精品久久网站 | 综合色爱 | 免费一级日韩欧美性大片 | 久在线 | 天堂av一区二区 | 在线观看亚洲电影 | 国产亚洲精品久久久久久大师 | 成人av在线影院 | 久久精品99 | 久久伊人精品一区二区三区 | 亚洲高清精品在线 | 国产美女免费看 | 久久九精品 | 久久久免费精品国产一区二区 | 在线亚洲激情 | 国产拍在线 | 国产一级高清 | 黄色一级在线视频 | 精品免费久久久久 | 天天干天天操天天搞 | 99久久精品国产一区二区三区 | 亚洲欧美日韩一二三区 | 久久曰视频 | 超碰公开在线 | 美女视频久久黄 | 中文字幕亚洲五码 | 色就干| 玖玖爱在线观看 | 中文字幕av免费 | 午夜精品福利一区二区 | 国产成人中文字幕 | 免费看的黄色网 | 人成午夜视频 | 日韩av在线免费看 | 在线午夜| 亚洲精品456在线播放乱码 | 久久国产精品一二三区 | av中文字幕在线播放 | 五月婷婷综合在线视频 | 99久久久久免费精品国产 | 中文字幕网址 | 久久99国产精品自在自在app | 国产女人40精品一区毛片视频 | 国产在线日韩 | 午夜精品久久久久久久99热影院 | www.97色.com| www.日韩免费| 亚洲精色| 国产精品一区二区你懂的 | 手机在线看永久av片免费 | 人人超碰97 | 国产视频精品网 | av成人黄色 | 日韩电影中文字幕 | 国产成人精品国内自产拍免费看 | 久久综合九色九九 | 一区二区伦理 | 亚洲劲爆av| 日韩黄视频 | 欧美激情视频一二三区 | 99热国产在线中文 | 美女黄网久久 | 欧美另类69 | 中文网丁香综合网 | 久久精品一二三 | 狠狠干干 | 夜夜操夜夜干 | 一级黄色在线视频 | 欧美激情视频在线观看免费 | 成年人国产视频 | 亚洲91精品在线观看 | 成人免费色| 超碰在线9 | 欧美激情精品久久久久久免费 | 日韩精品国产一区 | 天天夜操 | 久热免费在线 | 久久96| 正在播放五月婷婷狠狠干 | 欧美成人基地 | 欧美精品一级视频 | 久久伦理 | 悠悠av资源片 | 天天综合网在线观看 | 日本mv大片欧洲mv大片 | 亚洲经典视频在线观看 | 不卡av在线 | 国产精品美女久久久久久久久久久 | 在线中文字幕播放 | 国产成人av在线影院 | 久久久久久久久久久免费av | 丁香久久五月 | 福利久久久 | www色片| 在线超碰av | 黄色中文字幕在线 | 久日精品 | 99精品视频观看 | 欧美激情第28页 | 成人免费大片黄在线播放 | 国产成人精品久久 | 青草草在线 | japanesexxxxfreehd乱熟 | 日韩在线精品一区 | 国产亚洲精品bv在线观看 | 亚洲国产高清视频 | 久久久国产网站 | 欧美日高清视频 | 国产精品自产拍在线观看蜜 | 中文在线中文资源 | 国产精品美女久久久久久久 | 国产手机免费视频 | 激情综合亚洲 | 午夜精品一区二区三区在线播放 | 天天爽天天搞 | 美女免费视频一区二区 | 亚洲理论视频 | 女人18片毛片90分钟 | 久久久91精品国产一区二区三区 | 欧美91精品久久久久国产性生爱 | 午夜久操 | 国产精品久久久久永久免费观看 | 国产精品午夜在线 | 日韩精品大片 | 欧美在线不卡一区 | 天天躁日日| 久久久久国产一区二区三区四区 | 亚洲国产人午在线一二区 | 亚洲成人软件 | 97福利社 | 五月婷婷一区二区三区 | av久久在线 | 成人黄色在线看 | 91精品国产91久久久久 | 亚洲免费av电影 | 成人天堂网 | 国产最新91 | 激情丁香5月 | 中文字幕在线播放av | 999久久久久久 | 99爱在线| 久久99精品国产91久久来源 | 色综合久久久久综合体桃花网 | 91在线最新 | 黄色av一区| 国产亚洲免费观看 | 丁香导航 | 久久www免费人成看片高清 | 五月激情丁香图片 | 日韩最新在线 | 伊人影院在线观看 | 色婷久久| 午夜视频导航 | 久草视频免费 | 在线观看亚洲视频 | 国产91大片| 五月婷社区 | 18网站在线观看 | 奇米网网址 | 日本不卡一区二区 | 韩国一区二区三区视频 | 欧美日韩二区三区 | 狠狠色综合网站久久久久久久 | 日韩欧美高清视频在线观看 | 成人午夜电影网站 | 射射射综合网 | 国产精品3区 | 国产日韩欧美在线播放 | 国产丝袜高跟 | 日本不卡123| 国产精品麻豆免费版 | 韩国av免费在线观看 | www.五月婷| 久艹在线播放 | av在线电影免费观看 | av黄色影院 | 成人免费视频网站在线观看 | 国产精品久久久久影院 | 午夜狠狠干 | 午夜精品视频免费在线观看 | 色在线免费 | 日操干| 天天操天天爽天天干 | 亚洲香蕉在线观看 | 菠萝菠萝蜜在线播放 | 国产成人中文字幕 | 超碰成人网| 日韩视频二区 | 很黄很黄的网站免费的 | 免费亚洲电影 | 国产日韩精品在线观看 | 成人av电影免费在线播放 | 欧美色插| 国产免费不卡av | 美女网站视频免费黄 | 99久久99久久综合 | 国产第页 | 精品久久国产 | 亚洲永久av | 成年人在线免费看片 | 国产麻豆传媒 | 国产+日韩欧美 | 久久一区二区三区国产精品 | 国产一区二区高清 | 国产黄色免费观看 | 色综合天天狠狠 | 成人久久久久久久久 | 中文字幕 国产视频 | 国产你懂的在线 | 丁香5月婷婷 | 欧美91精品久久久久国产性生爱 | 六月丁香婷婷网 | 日日夜夜免费精品 | 久草资源在线观看 | 国产成人精品日本亚洲999 | 成人av一区二区兰花在线播放 | 成人a级免费视频 | 久久99精品一区二区三区三区 | 最新av在线播放 | 999视频网站 | 久久精品精品电影网 | 国产精品久久久av | 亚洲电影院| 91免费的视频在线播放 | 欧美视频www | 国产大陆亚洲精品国产 | 粉嫩aⅴ一区二区三区 | 国产精品a成v人在线播放 | 九九在线视频免费观看 | 久草免费在线视频 | 亚洲日本国产精品 | 伊人五月天.com | 色婷婷免费 | 久久黄色美女 | 国产精品黄色影片导航在线观看 | 黄a网| 国产亚洲va综合人人澡精品 | www.黄色片网站| 国产精品黄色在线观看 | 丁香激情网 | 91高清完整版在线观看 | 国产一区二区电影在线观看 | 午夜骚影 | 少妇18xxxx性xxxx片 | 人成免费网站 | 亚洲国产片色 | 亚洲精品国产片 | 婷婷色六月天 | 中文字幕在线观看不卡 | 亚洲五月激情 | 在线观看成人国产 | 娇妻呻吟一区二区三区 | 久草网站在线观看 | 91精品视频免费在线观看 | 国产一区二区三区 在线 | 久久精品国产免费看久久精品 | 91网页版免费观看 | 日韩欧美精品一区二区三区经典 | 久久久亚洲网站 | 日本在线观看一区二区 | 国产精品成人一区二区三区吃奶 | 国产在线自 | 久久久久观看 | 久久都是精品 | 欧美另类一二三四区 | 99成人精品| 激情av五月婷婷 | av免费电影在线 | 久久电影网站中文字幕 | 久久黄色免费 | 亚洲激情在线视频 | 免费观看一级视频 | 免费av 在线| 四虎在线免费观看视频 | 久草在线免费播放 | 欧美aa级 | 91在线视频精品 | 国产精品美女久久久久久久久 | 99色在线观看 | 不卡的av电影在线观看 | 在线观看免费视频你懂的 | 天海冀一区二区三区 | 亚洲精品视频免费观看 | 麻豆国产精品视频 | 久久一区91 | 国产精品二区在线观看 | 久久综合9988久久爱 | 久久9视频 | 美国三级黄色大片 | 日韩中文久久 | 国产日女人 | 午夜精品一区二区三区视频免费看 | 国产精品中文字幕在线观看 | 久久免费播放视频 | www.五月天色 | 免费看的黄网站 | 亚洲成人av一区二区 | 欧美日韩在线精品一区二区 | 欧美激情片在线观看 | 国产91在线观 | 91免费在线看片 | 久久国产色 | 欧美 日韩 国产 成人 在线 | 国产 日韩 中文字幕 | 亚洲精品99久久久久久 | 激情欧美丁香 | 免费视频a | 美女网站在线看 | 亚洲国产成人久久综合 | 日本久久视频 | 午夜国产成人 | 88av视频| 国产分类视频 | 九九免费观看全部免费视频 | 青草草在线视频 | 韩日av在线| 午夜国产在线 | 欧美日韩91 | 黄色大片免费网站 | 97超级碰碰碰视频在线观看 | 中文字幕丝袜美腿 | 亚洲va综合va国产va中文 | 在线天堂视频 | 九九激情视频 | 岛国片在线 | 色综合天天在线 | 亚洲精品一区二区三区四区高清 | 91丨九色丨高潮丰满 | 色丁香久久 | 日本黄区免费视频观看 | 国产色视频123区 | 五月天亚洲精品 | 精品黄色视 | 九九综合九九 | 欧美淫aaa免费观看 日韩激情免费视频 | 国产艹b视频 | 亚洲精品美女在线观看 | 黄色片视频免费 | 国产91在线 | 美洲 | 国产精品青青 | 97在线影院| 国产999免费视频 | 综合久久久久久久 | 日韩网站免费观看 | 国产三级香港三韩国三级 | 丁香六月色 | 久久视频精品 | 91丨九色丨蝌蚪丰满 | 操操色 | 99精品在线 | 久草在线视频免费资源观看 | 久久久午夜剧场 | 深夜免费小视频 | 69国产盗摄一区二区三区五区 | 91一区在线观看 | 免费精品视频在线 | 亚洲国产影院av久久久久 | 怡红院av久久久久久久 | 婷婷视频导航 | 精品视频在线看 | 欧美日韩一区久久 | 久久久久久久免费观看 | 成人在线一区二区三区 | 天躁狠狠躁 | 久久成人国产精品免费软件 | 久久久久激情视频 | 国产伦精品一区二区三区免费 | 亚洲精品网址在线观看 | 91理论电影 | 99精品国产一区二区 | 在线你懂的视频 | 九九国产视频 | 黄污网站在线 | 成人黄色中文字幕 | 亚洲精品视频播放 | 黄色a视频免费 | 国产欧美精品xxxx另类 | 日韩免费一区二区 | 欧美精品在线观看一区 | 久久人91精品久久久久久不卡 | 亚洲一级特黄 | 99电影456麻豆 | 国产一区二区三区免费观看视频 | 婷婷色在线视频 | 久久久精品国产一区二区 | 伊甸园永久入口www 99热 精品在线 | 日韩在观看线 | 亚洲成人蜜桃 | 人人澡人摸人人添学生av | 久久色视频 | 精品久久片 | 97国产精品久久 | 91久久爱热色涩涩 | 一本一道久久a久久精品蜜桃 | 久久久久久国产精品美女 | 精品亚洲成a人在线观看 | 碰超在线观看 | 免费久久网 | av网站手机在线观看 | 国产a级免费 | 日韩精品欧美专区 | 日韩精品久久久久久中文字幕8 | 波多野结衣视频一区 | 92精品国产成人观看免费 | 999久久久免费精品国产 | 亚洲色综合 | 免费看一及片 | 五月天中文字幕 | 人人艹视频 | 在线观看网站你懂的 | 久艹视频免费观看 | 天天se天天cao天天干 | 美女网站视频久久 | 精品视频国产 | 黄色a视频| 日本久久成人 | 国产日韩欧美在线观看 | 六月激情 | 成 人 黄 色 视频播放1 | 手机av在线免费观看 | 在线成人短视频 | 久久视了 | 午夜12点 | 国产一区视频在线 | 久久人人爽人人爽人人片av软件 | 久久综合九色综合97婷婷女人 | 麻豆一区二区 | 99视频久 | 人人澡超碰碰97碰碰碰软件 | 久久伊人五月天 | 天天综合网 天天综合色 | 中文字幕av专区 | 色综合久久久久久久 | 日本狠狠色 | 午夜视频黄 | 97超碰国产在线 | 国产精品系列在线播放 | 五月婷婷激情六月 | 国产色婷婷精品综合在线手机播放 | 综合网在线视频 | 99免费在线观看视频 | 婷婷丁香在线视频 | 在线亚洲日本 | 国产又粗又硬又爽视频 | 亚洲精品黄色 | 国产精品一区二区av日韩在线 | 99久久精品国产系列 | 成片视频在线观看 | 亚洲成人在线免费 | 狠狠色噜噜狠狠狠合久 | 亚洲专区中文字幕 | 国产麻豆电影在线观看 | 在线观看国产区 | 四虎永久国产精品 | 日韩黄色免费在线观看 | 人人爱人人舔 | 狠狠色2019综合网 | 激情综合网色播五月 | 一本大道久久精品懂色aⅴ 五月婷社区 | 亚洲春色奇米影视 | 国产成人综合图片 | 精品国产欧美一区二区三区不卡 | 国产精品色婷婷 | 免费情趣视频 | 亚洲欧美视频网站 | 中文在线天堂资源 | 黄色三几片 | 国产一区二区不卡在线 | 天天鲁一鲁摸一摸爽一爽 | 久久久久久国产精品999 | 中文av在线播放 | 91亚洲精| 免费看黄20分钟 | 欧美黄色软件 | 日韩免费一级a毛片在线播放一级 | 黄色毛片视频 | 亚洲免费视频观看 | 最近免费观看的电影完整版 | 麻豆影视在线观看 | 91亚洲精品在线 | 久久久久久久久久电影 | 国产永久免费高清在线观看视频 | 99在线免费观看视频 | 一区二区三区免费播放 | 人人爱人人爽 | 国产亚洲高清视频 | 久久99国产精品久久99 | 亚洲欧洲成人精品av97 | 成人午夜影院 | 在线观看精品黄av片免费 | www.888av| 中文字幕精品一区二区精品 | 国产视频1 | 国产一区免费在线观看 | 香蕉在线视频观看 | 国产成人91 | 99精品视频在线观看 | 久久999久久 | 中文字幕视频在线播放 | 精品一区二区在线免费观看 | 国产视频精品免费 | 欧美激情va永久在线播放 | av免费在线网站 | 91成人小视频 | av在线播放快速免费阴 | 91视频在线看 | 成人午夜电影在线观看 | 日韩一区二区在线免费观看 | 91色国产在线 | 一区二区激情视频 | 国产在线播放不卡 | 精品欧美日韩 | 国产小视频网站 | 六月丁香激情网 | 中文免费| 91免费日韩| 婷婷深爱网 | 激情网在线视频 | 欧美国产高清 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 91免费的视频在线播放 | 日韩手机在线观看 | 久久男人中文字幕资源站 | 亚洲第一区精品 | 国产精品精品 | 国产流白浆高潮在线观看 | 久久av电影 | 久9在线 | 三级黄色大片在线观看 | 免费日韩一区二区三区 | 天天爱天天操 | 中文字幕在线观看完整版 | 91免费版成人 | 日韩免费视频一区二区 | av高清免费 | 色婷婷97 | 91精品一区二区三区蜜臀 | www.com久久久| 日韩欧美网址 | 欧美精品国产精品 | 观看免费av | 欧美国产日韩在线观看 | 久草视频在线免费播放 | 五月婷婷综合久久 | 超碰九九 | 91九色在线观看 | 亚洲精品小视频在线观看 | 国产一线二线三线性视频 | 在线观看韩日电影免费 | 99r在线 | 最新黄色av网址 | av色影院 | 三级黄色片子 | 六月丁香伊人 | 永久免费毛片 | 男女视频国产 | 日日爽视频| 日韩av看片 | 91在线日本 | 91网在线观看 | 欧美久久久影院 | 麻豆影视在线播放 | 黄色av免费 | 五月天高清欧美mv | 免费亚洲成人 | 91精品国产91热久久久做人人 | 99视频精品视频高清免费 | 婷婷播播网 | 九九视频在线观看视频6 | 午夜婷婷网 | 就要色综合 | 深夜免费网站 | 日韩aⅴ视频 | 亚洲激情小视频 | 99国产精品久久久久老师 | 99免费在线视频观看 | 日韩中文久久 | 国产视频久 | 久久观看免费视频 | 国产黄色在线观看 | 国产精品国产毛片 | 国产精久久 | 中文字幕在线成人 | 欧美激情精品久久久 | 在线观看www视频 | 欧美日韩在线免费视频 | 91香蕉视频污在线 | 国产婷婷精品 | 天天综合久久 | 丝袜美腿亚洲综合 | 国产精品久久久毛片 | 国产精品系列在线观看 | 91色综合 | 91九色老 | 午夜精品一二三区 | 91女子私密保健养生少妇 | 夜色资源站国产www在线视频 | 天天鲁一鲁摸一摸爽一爽 | 色伊人网 | 精品五月天 | 狠狠久久婷婷 | 成人国产精品久久久久久亚洲 | 日韩美女一级片 | 九九视频在线播放 | 久久免费片 | 久草在线最新 | 欧美性色综合 | 最近中文字幕大全中文字幕免费 | 日日干美女 | 日日干干夜夜 | 夜夜干夜夜 | 69久久99精品久久久久婷婷 | av中文在线播放 | 成年人黄色大片在线 | 亚洲精品h | 在线免费观看视频你懂的 | 欧美日一级片 | 91在线视频播放 | 亚洲成人麻豆 | 国产精品九九九九九九 | 伊人中文网 | 97看片 | 一级黄色毛片 | 日韩欧美一区二区在线 | 在线小视频你懂得 | 97超碰人人模人人人爽人人爱 | 日韩美精品视频 | 久久成人资源 | 欧美成年黄网站色视频 | 日韩大片在线观看 | 亚洲成人免费观看 | 久久人人爽人人人人片 | av直接看 | 91漂亮少妇露脸在线播放 | 手机av电影在线观看 | 国产亚洲成av片在线观看 | www色com| 天天操天天综合网 | 国产成人一区二区三区电影 | 久久调教视频 | 综合中文字幕 | 久久综合九色九九 | av电影在线观看完整版一区二区 | 四虎www. | 五月视频| 天天躁日日躁狠狠躁av中文 | 日韩有码欧美 | 久久99精品视频 | 黄污视频网站大全 | 中文字幕精品www乱入免费视频 | 婷婷av网| 亚洲精品美女久久 | 伊人影院99 | 一级黄色在线免费观看 | 欧美激情第八页 | 91九色丨porny丨丰满6 | 国产成人一区二区啪在线观看 | av网站手机在线观看 | 国产精品久久久久久久毛片 | 午夜久久视频 | 欧美精品久久久久久久久久白贞 | 国产中文字幕在线看 | 一本一本久久a久久精品综合小说 | 国产精品久久久久久久99 | 欧美亚洲国产精品久久高清浪潮 | 中文字幕在线人 | 国产免费又粗又猛又爽 | 久精品视频 | 99精品在线 | 99精品国产aⅴ| 国产九色91 | 日日夜夜免费精品 | 国产成人在线精品 | 日韩精品一区不卡 | 国产自产高清不卡 | 国产精品ⅴa有声小说 | 成年人视频在线 | 色婷婷88av视频一二三区 | 亚洲欧洲成人精品av97 | 99精品乱码国产在线观看 | 香蕉视频在线看 | 久草观看视频 | 91大神精品视频在线观看 | a视频在线观看 | 久久婷婷一区 | 免费在线播放 | 激情av资源网| 在线观看精品黄av片免费 | 激情久久伊人 | 久免费视频 | 日韩三级不卡 | 国产免费观看久久黄 | av在线短片 | 97av视频在线观看 | 久久久69| 天天综合网在线 | 国产成视频在线观看 | 狠狠干婷婷色 | 久久超级碰 | 日本三级久久 | 欧美十八 | 在线看av的网址 | 不卡中文字幕在线 | 国产成人三级三级三级97 | 久久综合五月天婷婷伊人 | 98超碰在线| 91精品伦理 | 99爱视频| av资源免费观看 | 国产一区成人在线 | 成人午夜黄色影院 | 久久激情小说 | 亚洲精品国产精品99久久 | 天天天天天天天操 | 国产成人精品一区二区三区在线 | 久久久片| 97av在线视频免费播放 | 中文在线a在线 | 97偷拍视频 | 国产精品免费不卡 | 亚洲精品女人 | 国产看片网站 | 中文字幕精品视频 | 91成熟丰满女人少妇 | 在线观看国产一区 | 五月婷婷久草 | 国产特级毛片 | 成人在线观看影院 | 最近能播放的中文字幕 | wwwwww国产 | 天天综合色 | 欧美最猛性xxxxx免费 | 成人资源在线观看 | 日韩欧美国产激情在线播放 | 日本中文乱码卡一卡二新区 | 久久久久在线观看 | 中国一区二区视频 | av黄色亚洲 | 中文字幕中文字幕在线中文字幕三区 | 日韩精品极品视频 | 夜夜操天天操 | 中文字幕久久精品亚洲乱码 | 成年人免费在线 | 欧美日本三级 | 91成人久久 | 亚洲国产影院av久久久久 | 国产精品免费久久久久久 | 久久人人97超碰com | 69xxxx欧美| 91黄视频在线 | 天堂va在线高清一区 | 国产中文字幕视频在线观看 | 亚洲 欧洲 国产 日本 综合 | 黄色小说在线观看视频 | aav在线| 免费av网址大全 | 久久精品免费看 | 欧美国产日韩在线观看 | 精品久久久影院 | 伊人久久国产 | 久久这里精品视频 | 超碰成人av | 欧美久久久久久久久久久久久 | 精品久久免费看 | 国产视频在 | 中文字幕一区在线 | 人人添人人澡 | 日韩高清国产精品 | 久久97久久97精品免视看 | 精品不卡av| 亚洲成人精品久久久 | 黄a在线观看 | 亚洲精选视频免费看 | 一区二区三区四区五区在线 | 久久99国产精品免费网站 | 国产精品入口久久 | 国产精品第7页 | 精品美女在线视频 | 亚洲欧美日本国产 | 欧美精品做受xxx性少妇 | 亚洲精品一区二区网址 | 午夜视频在线观看欧美 | 日日夜夜婷婷 | 亚洲3级| 国产四虎在线 | 国产精品美女免费视频 | 欧美精品在线观看一区 | 免费在线a | 国产精品资源 | 在线视频观看成人 | 在线看福利av| 五月天av在线 | 一区二区三区在线看 | 国产美女精彩久久 | 国产成人精品一区二区三区在线观看 | 人人添人人澡 | 国产一级视频在线免费观看 | 久久亚洲电影 | 精品在线看 | 五月婷婷激情 | 97在线视频网站 | 亚洲三级在线免费观看 | 麻豆精品传媒视频 | 亚洲天堂网视频 | 久久婷婷国产色一区二区三区 | 国产一区精品在线 | 五月婷婷六月丁香激情 | 欧美日韩大片在线观看 | 国产中文字幕久久 | 天天爽综合网 | www亚洲一区 | 国产精品久久久久久久久久妇女 | 黄色一级网 | 在线免费性生活片 | 天天插天天狠 | 中文字幕电影高清在线观看 | 成年人免费在线观看 | 国产美女在线免费观看 | 精品视频在线免费 | 最近高清中文在线字幕在线观看 | 天天爱综合 |