導航:首頁 > 源碼編譯 > systemcall源碼

systemcall源碼

發布時間:2022-07-18 12:05:46

Ⅰ 如何在linux內核里增加一個系統調用

一、Linux0.11下添加系統調用:

我在bochs2.2.1中對linux0.11內核添加了一個新的系統調用,步驟如下:
1./usr/src/linux/include/unistd.h中添加:#define __NR_mytest 87
然後在下面聲明函數原型:int mytest();
2./usr/src/linux/include/linux/sys.h中添加:extern int sys_mytest();
然後在sys_call_table中最後加上sys_mytest;
3.在/usr/src/linux/kernel/sys.c中添加函數實現如下:
int sys_mytest(){
printk("This is a test!");
return 123;
}
4.在/usr/src/linux/kernel/system_call.s中對系統調用號加1(原來是86改成了87)
5.然後到/usr/src/linux目錄下編譯內核make clean; make Image
6. cp /usr/src/linux/include/unistd.h /usr/include/unistd.h
7. reset bochs
8. 在/usr/root中生成test.c文件如下:
#define __LIBRARY__
#include <unistd.h>
_syscall0(int,mytest)
int main(){
int a;
a = mytest();
printf("%d", a);
return 0;
}
9.然後gcc test.c編譯之後運行a.out,前面所有步驟都通過,但是每次調用都是返回-1,然後我查過errno為1(表示操作不允許),就不知道為什麼了?
系統知道的高手們能夠告知一下,不勝感激!這個問題困擾我很久了!

二、新Linux內核添加系統調用

如何在Linux系統中添加新的系統調用
系統調用是應用程序和操作系統內核之間的功能介面。其主要目的是使得用戶可以使用操作系統提供的有關設備管理、輸入/輸入系統、文件系統和進程式控制制、通信以及存儲管理等方面的功能,而不必了解系統程序的內部結構和有關硬體細節,從而起到減輕用戶負擔和保護系統以及提高資源利用率的作用。

Linux操作系統作為自由軟體的代表,它優良的性能使得它的應用日益廣泛,不僅得到專業人士的肯定,而且商業化的應用也是如火如荼。在Linux中,大部分的系統調用包含在Linux的libc庫中,通過標準的C函數調用方法可以調用這些系統調用。那麼,對Linux的發燒友來說,如何在Linux中增加新的系統調用呢?
1 Linux系統調用機制

在Linux系統中,系統調用是作為一種異常類型實現的。它將執行相應的機器代碼指令來產生異常信號。產生中斷或異常的重要效果是系統自動將用戶態切換為核心態來對它進行處理。這就是說,執行系統調用異常指令時,自動地將系統切換為核心態,並安排異常處理程序的執行。Linux用來實現系統調用異常的實際指令是:

Int $0x80

這一指令使用中斷/異常向量號128(即16進制的80)將控制權轉移給內核。為達到在使用系統調用時不必用機器指令編程,在標準的C語言庫中為每一系統調用提供了一段短的子程序,完成機器代碼的編程工作。事實上,機器代碼段非常簡短。它所要做的工作只是將送給系統調用的參數載入到CPU寄存器中,接著執行int $0x80指令。然後運行系統調用,系統調用的返回值將送入CPU的一個寄存器中,標準的庫子程序取得這一返回值,並將它送回用戶程序。

為使系統調用的執行成為一項簡單的任務,Linux提供了一組預處理宏指令。它們可以用在程序中。這些宏指令取一定的參數,然後擴展為調用指定的系統調用的函數。

這些宏指令具有類似下面的名稱格式:

_syscallN(parameters)

其中N是系統調用所需的參數數目,而parameters則用一組參數代替。這些參數使宏指令完成適合於特定的系統調用的擴展。例如,為了建立調用setuid()系統調用的函數,應該使用:

_syscall1( int, setuid, uid_t, uid )

syscallN( )宏指令的第1個參數int說明產生的函數的返回值的類型是整型,第2個參數setuid說明產生的函數的名稱。後面是系統調用所需要的每個參數。這一宏指令後面還有兩個參數uid_t和uid分別用來指定參數的類型和名稱。

另外,用作系統調用的參數的數據類型有一個限制,它們的容量不能超過四個位元組。這是因為執行int $0x80指令進行系統調用時,所有的參數值都存在32位的CPU寄存器中。使用CPU寄存器傳遞參數帶來的另一個限制是可以傳送給系統調用的參數的數目。這個限制是最多可以傳遞5個參數。所以Linux一共定義了6個不同的_syscallN()宏指令,從_syscall0()、_syscall1()直到_syscall5()。

一旦_syscallN()宏指令用特定系統調用的相應參數進行了擴展,得到的結果是一個與系統調用同名的函數,它可以在用戶程序中執行這一系統調用。
2 添加新的系統調用
如果用戶在Linux中添加新的系統調用,應該遵循幾個步驟才能添加成功,下面幾個步驟詳細說明了添加系統調用的相關內容。

(1) 添加源代碼

第一個任務是編寫加到內核中的源程序,即將要加到一個內核文件中去的一個函數,該函數的名稱應該是新的系統調用名稱前面加上sys_標志。假設新加的系統調用為mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代碼,如下所示:
asmlinkage int sys_mycall(int number)
{
return number;
}
作為一個最簡單的例子,我們新加的系統調用僅僅返回一個整型值。

(2) 連接新的系統調用

添加新的系統調用後,下一個任務是使Linux內核的其餘部分知道該程序的存在。為了從已有的內核程序中增加到新的函數的連接,需要編輯兩個文件。

在我們所用的Linux內核版本(RedHat 6.0,內核為2.2.5-15)中,第一個要修改的文件是:

/usr/src/linux/include/asm-i386/unistd.h

該文件中包含了系統調用清單,用來給每個系統調用分配一個唯一的號碼。文件中每一行的格式如下:

#define __NR_name NNN

其中,name用系統調用名稱代替,而NNN則是該系統調用對應的號碼。應該將新的系統調用名稱加到清單的最後,並給它分配號碼序列中下一個可用的系統調用號。我們的系統調用如下:

#define __NR_mycall 191

系統調用號為191,之所以系統調用號是191,是因為Linux-2.2內核自身的系統調用號碼已經用到190。

第二個要修改的文件是:

/usr/src/linux/arch/i386/kernel/entry.S

該文件中有類似如下的清單:
.long SYMBOL_NAME()

該清單用來對sys_call_table[]數組進行初始化。該數組包含指向內核中每個系統調用的指針。這樣就在數組中增加了新的內核函數的指針。我們在清單最後添加一行:
.long SYMBOL_NAME(sys_mycall)

(3) 重建新的Linux內核

為使新的系統調用生效,需要重建Linux的內核。這需要以超級用戶身份登錄。
#pwd
/usr/src/linux
#

超級用戶在當前工作目錄(/usr/src/linux)下,才可以重建內核。

#make config
#make dep
#make clearn
#make bzImage

編譯完畢後,系統生成一可用於安裝的、壓縮的內核映象文件:

/usr/src/linux/arch/i386/boot/bzImage
(4) 用新的內核啟動系統
要使用新的系統調用,需要用重建的新內核重新引導系統。為此,需要修改/etc/lilo.conf文件,在我們的系統中,該文件內容如下:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50

image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only

other=/dev/hda1
label=dos
table=/dev/had

首先編輯該文件,添加新的引導內核:
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only

添加完畢,該文件內容如下所示:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50

image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only

image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only

other=/dev/hda1
label=dos
table=/dev/hda

這樣,新的內核映象bzImage-new成為預設的引導內核。為了使用新的lilo.conf配置文件,還應執行下面的命令
#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new

其次配置lilo:

# /sbin/lilo

現在,當重新引導系統時,在boot:提示符後面有三種選擇:linux-new 、linux、dos,新內核成為預設的引導內核。
至此,新的Linux內核已經建立,新添加的系統調用已成為操作系統的一部分,重新啟動Linux,用戶就可以在應用程序中使用該系統調用了。

(5)使用新的系統調用

在應用程序中使用新添加的系統調用mycall。同樣為實驗目的,我們寫了一個簡單的例子xtdy.c。

/* xtdy.c */
#include
_syscall1(int,mycall,int,ret)
main()
{
printf("%d \n",mycall(100));
}
編譯該程序:
# cc -o xtdy xtdy.c
執行:
# xtdy
結果:
# 100
注意,由於使用了系統調用,編譯和執行程序時,用戶都應該是超級用戶身份。

Ⅱ 如果想讓孩子學習編程,書籍方面究竟該如何選擇

Stevens著有三大本:UNIX環境高級編程、TCP/IP詳解、UNIX網路編程。我是抱著學習網路編程進而閱讀web framework源碼來學習它們的。另外也是想提升一下自己的編程素養,為以後看kernel源碼什麼的做鋪墊。首先我是買了這本書,另外兩套暫時沒買。開始也是各種不解,我就是想內核究竟幹些啥事,如何通過system_call與之通信?其實讀這些書需要一些基礎的。操作系統原理、gcc、shell等等。其實我也沒全看完,建議先把環境裝好(編譯apue.h),然後一個一個運行書中示例。當然不是盲目的學,要知道自己差那一塊就補那塊。

Ⅲ C4droid顯示bad system call這是怎麼回事

你好

Windows10系統電腦開機出現藍屏且提示錯誤代碼:BAD SYSTEM CONFIG INFO,這是怎麼回事呢?其實,該問題是由於系統中驅動不正確或誤刪系統文件導致的。下面,系統城小編就給大家分享下具體解決方法。
推薦:w10系統正式版
步驟如下:
2、然後選中「自動修復」進行修復,完成後重啟計算機即可。
Win10系統電腦藍屏提示「BAD SYSTEM CONFIG INFO」的解決方法就為大家介紹到這里了。遇到類似問題的朋友們,不妨試著操作看看,相信會有不一樣的驚喜。

系統有問題了。直接換個驗證過的系統盤重裝系統就行了,這樣就可以全程自動、順利解決 win10系統開機藍屏的問題了。用u盤或者硬碟這些都是可以的,且安裝速度非常快。安裝方法如下:

Ⅳ 急用添加一個system call到linux內核。

誰會有時間寫這個,都用strace命令。。

添加系統調用的話:

看LINUX內核模塊編程指南.pdf第7章

至於遍歷系統調用

  1. for_each_process() 就是輪詢所有進程,它的參數就是task_struct

  2. 查看一個task系統調用:可以用 task_current_syscall(libsyscall.c)它用於返回某個進程阻塞於哪個系統調用,返回的系統調用用編號表示,你需要根據系統調用表進行映射

Ⅳ errno.h的源代碼

以下來自linux 2.4.20-18的內核代碼中的/usr/include/asm/errno.h
#ifndef _I386_ERRNO_H
#define _I386_ERRNO_H
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Arg list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Not a typewriter */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read-only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */
#define EDEADLK 35 /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
#define ENOLCK 37 /* No record locks available */
#define ENOSYS 38 /* Function not implemented */
#define ENOTEMPTY 39 /* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN /* Operation would block */
#define ENOMSG 42 /* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define ECHRNG 44 /* Channel number out of range */
#define EL2NSYNC 45 /* Level 2 not synchronized */
#define EL3HLT 46 /* Level 3 halted */
#define EL3RST 47 /* Level 3 reset */
#define ELNRNG 48 /* Link number out of range */
#define EUNATCH 49 /* Protocol driver not attached */
#define ENOCSI 50 /* No CSI structure available */
#define EL2HLT 51 /* Level 2 halted */
#define EBADE 52 /* Invalid exchange */
#define EBADR 53 /* Invalid request descriptor */
#define EXFULL 54 /* Exchange full */
#define ENOANO 55 /* No anode */
#define EBADRQC 56 /* Invalid request code */
#define EBADSLT 57 /* Invalid slot */
#define EDEADLOCK EDEADLK
#define EBFONT 59 /* Bad font file format */
#define ENOSTR 60 /* Device not a stream */
#define ENODATA 61 /* No data available */
#define ETIME 62 /* Timer expired */
#define ENOSR 63 /* Out of streams resources */
#define ENONET 64 /* Machine is not on the network */
#define ENOPKG 65 /* Package not installed */
#define EREMOTE 66 /* Object is remote */
#define ENOLINK 67 /* Link has been severed */
#define EADV 68 /* Advertise error */
#define ESRMNT 69 /* Srmount error */
#define ECOMM 70 /* Communication error on send */
#define EPROTO 71 /* Protocol error */
#define EMULTIHOP 72 /* Multihop attempted */
#define EDOTDOT 73 /* RFS specific error */
#define EBADMSG 74 /* Not a data message */
#define EOVERFLOW 75 /* Value too large for defined data type */
#define ENOTUNIQ 76 /* Name not unique on network */
#define EBADFD 77 /* File descriptor in bad state */
#define EREMCHG 78 /* Remote address changed */
#define ELIBACC 79 /* Can not access a needed shared library */
#define ELIBBAD 80 /* Accessing a corrupted shared library */
#define ELIBSCN 81 /* .lib section in a.out corrupted */
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
#define EILSEQ 84 /* Illegal byte sequence */
#define ERESTART 85 /* Interrupted system call should be restarted */
#define ESTRPIPE 86 /* Streams pipe error */
#define EUSERS 87 /* Too many users */
#define ENOTSOCK 88 /* Socket operation on non-socket */
#define EDESTADDRREQ 89 /* Destination address required */
#define EMSGSIZE 90 /* Message too long */
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
#define ENOPROTOOPT 92 /* Protocol not available */
#define EPROTONOSUPPORT 93 /* Protocol not supported */
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT 96 /* Protocol family not supported */
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
#define EADDRINUSE 98 /* Address already in use */
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
#define ENETDOWN 100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET 102 /* Network dropped connection because of reset */
#define ECONNABORTED 103 /* Software caused connection abort */
#define ECONNRESET 104 /* Connection reset by peer */
#define ENOBUFS 105 /* No buffer space available */
#define EISCONN 106 /* Transport endpoint is already connected */
#define ENOTCONN 107 /* Transport endpoint is not connected */
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
#define ETIMEDOUT 110 /* Connection timed out */
#define ECONNREFUSED 111 /* Connection refused */
#define EHOSTDOWN 112 /* Host is down */
#define EHOSTUNREACH 113 /* No route to host */
#define EALREADY 114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE 116 /* Stale NFS file handle */
#define EUCLEAN 117 /* Structure needs cleaning */
#define ENOTNAM 118 /* Not a XENIX named type file */
#define ENAVAIL 119 /* No XENIX semaphores available */
#define EISNAM 120 /* Is a named type file */
#define EREMOTEIO 121 /* Remote I/O error */
#define EDQUOT 122 /* Quota exceeded */
#define ENOMEDIUM 123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
#endif

Ⅵ Linux C語言用system()調用,帶參數

linux c system函數介紹:

system(執行shell 命令)
相關函數
fork,execve,waitpid,popen
表頭文件
#i nclude
定義函數
int system(const char * string);
函數說明
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字元串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值
=-1:出現錯誤
=0:調用成功但是沒有出現子進程
>0:成功退出的子進程的id
如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值>。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
附加說明
在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例
#i nclude
main()
{
system("ls -al /etc/passwd /etc/shadow");
}
執行結果:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shado
例2:
char tmp[];
sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev);
system(tmp);
其中dev是/dev/sda1。

system函數的源碼

#include <syspes.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>

int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL){
return (1);
}

if((pid = fork())<0){
status = -1;
}
else if(pid = 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
-exit(127); //子進程正常執行則不會執行此語句
}
else
{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER)
{
status = -1;
break;
}
}
}

return status;
}

那麼如何獲得system的返回值呢??

char buf[10];
char * ps="ps -ef|grep -c root";
FILE *ptr;
int i;

if((ptr = popen(ps, "r")) != NULL)
{
fgets(buf, 10 , ptr);
i = atoi(buf);
pclose(ptr);
}

可以man下waitpid查看下如何檢查status的值
int ret = system("ls -al /etc/passwd /etc/shadow");
if(WIFSIGNALED(ret))
具體的這些宏查看man waitpid

Ⅶ VB編寫的區域網聊天工具源代碼

用VB做聊天程序的方法

---- 所謂"聊天"是指兩個程序能夠發送數據給對方。這個程序涉及到數據通訊的知識,彷彿很復雜,不過,由於VB給我們提供了一個Winsock控制項,問題就變得很簡單了。

---- 先編寫"聊天(主機)"程序。在窗體里添加Winsock控制項,並設置其Protocol屬性為1-SckUDPProtocol,其他屬性為預設值。接著添加兩個標簽和兩個文本框,設置兩個標簽的標題屬性分別為"接收窗"和"發送窗";兩個文本框的標題屬性為空。最後編寫代碼:

---- 1."聊天(主機)"

Private Sub Form-Load()
′設置網路地址
Winsock1.LocalPort=1024
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1999
End Sub
Private Sub Text1-Change()
′發送用戶輸入的內容
Winsock1.SendData Text1.Text
End Sub
Private Sub Winsock1-DataArrival
(Byval bytesTotal As Long)
Dim rec As String
′接收對方數據並在文本框內顯示
Winsock1.GetData rec, vb String
Text2.Text=rec
End Sub

---- 2."聊天(副機)"

Private Sub Form_Load()
′設置網路地址
Winsock1.LocalPort=1999
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1024

---- 其他部分程序與(主機)相同。最後將兩個程序存檔,並編譯成執行(.Exe)文件。現在就可以使用這個程序進行對話了。
---- 七.文本框中文本的某一特定字元或字元串同時高亮顯示的方法

---- 由於普通TextBox控制項不支持不連續字元串的同時高亮顯示,所以我們選擇RichTextBox控制項。單擊工程(Project)選單項,在彈出的下拉選單中單擊組件(Components)選單項,從彈出的對話框中選擇Microsoft Rich Textbox Control 5.0復選框,確定載入RichTextBox控制項。

---- 新建(New)一個工程,在窗體(Form)上添加一個RichTextBox控制項和兩個Command(按鈕)控制項,都採用系統默認的Name屬性值;設置RichTextBox的Text屬性值為空,Command1和Command2的Caption屬性值分別設為"輸入文本"和"選擇字元串"。最後,添加如下VB代碼:

Private Sub Command1-Click()
Dim str As String
Dim Text As String
str=〃輸入文本〃
Text=InputBox(str)
RichTextBox1.Text=Text
End Sub
Private Sub Command2-Click()
Dim str As String
Dim Text As String
Dim Position As Integer
Dim Lenth As Integer
str=〃輸入要高亮顯示的字元串〃
Text=InputBox(str)
If Text 〈〉 〃〃 Then
Position=InStr(RichTextBox1.Text, Text)-1
Lenth=Len(Text)
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Do While InStr(Position+Lenth+
1, RichTextBox1.Text, Text) 〈〉 0
Position=InStr(Position+Lenth+
1, RichTextBox1.Text, Text)-1
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Loop
End If
End Sub

---- 按F5執行程序,單擊"輸入文本"按鈕,在彈出的對話框中輸入一些文本,確定後,剛剛輸入的文本將顯示在RichTextBox中;再單擊"選擇字元串"按鈕,在彈出的對話框中輸入你希望高亮顯示的字元串,確定後,RichTextBox中相應的字元串將以紅色高亮顯示。
---- 八.編程實現Windows 95/98操作系統熱啟動的方法

---- 要利用程序實現系統的重新啟動,可以在你的程序中調用API函數來實現。建一個子函數:(以VB為例)

Declare Function SystemParametersInfo Lib 〃
user32〃 Alias -
〃SystemParametersInfo〃 (ByVal uAction As Long,
ByVal uParam As Long,
ByVal lpvParam As Any, ByVal
fuWinIni As Long) As Long
Sub DisableCtrlAltDelete(bDisabled As Boolean)
Dim X As Long
X=SystemParametersInfo(97, bDisabled, CStr(1), 0)
End Sub
Call DisableCtrlAltDelete(true) ′禁止熱啟
Call DisableCtrlAltDelete(false) ′允許熱啟

---- 九.在Windows 95/ 98啟動後自動啟動程序的方法
---- 我們都知道在Windows 95/98的"開始"→"程序"選單下有一"啟動"選單項,當每次啟動Windows 95或Windows 98時,系統都會自動啟動放在"啟動"選單欄里的可執行程序。

---- 但目前有好多軟體,像解霸五、ICQ,以及大部分實時偵測病毒的軟體等等,安裝後,並沒有放在"啟動"選單里,也能在啟動操作系統時自動啟動。怎麼實現的呢?

---- 其實只要知道Windows注冊表的一些知識,這個問題就不能稱之為問題了。用滑鼠單擊"開始",打開開始選單,再單擊"運行",出現一對話框,然後輸入"regedit",確定後,會打開系統注冊表編輯器,找到HKEY-LOCAL-MACHINE? SOFTWARE?Microsoft?Windows?CurrentVersion?Run,加入你的程序的入口,就可以了。如果不知道怎麼加,就參考一下已經存在的鍵值。

---- 十. 如何把數據文件輸出到Text控制項中?如果數據量比較大,窗體滿屏也不夠大,怎麼解決?

---- 有一個比較簡單的方法,就是把數據放到一個文本框(Text)里,並在其中加上水平和垂直滾動條。具體實現步驟為:先在窗體(Form)里加入一個文本框,採用默認名Text1;然後,設置文本框Text1的屬性:Text屬性設置為空,MultiLine屬性設置為True,ScrollBars屬性設置為3-Both;接著添加如下VB代碼:

Private Sub Form-Load()
Dim Handle As Integer
Dim FileName As String
On Error GoTo ErrExit
begin:
′輸入要顯示的數據文件的名稱
FileName=InputBox$(〃Input Filename〃,
〃Open File〃)
On Error GoTo FileErr
Handle=FreeFile
Open FileName For Input As #Handle
′把數據文件中的數據輸出到文本框中
Text1.Text=Input$(LOF(Handle), Handle)
Close #Handle
Exit Sub
FileErr:
Dim ErrNum As Integer
If Err.Number=53 Then
ErrNum=MsgBox(〃File not exist〃,
vbOKCancel, 〃Error Information〃)
If ErrNum=1 Then
GoTo begin
Else
Exit Sub
End If
End If
MsgBox Err.Description, , 〃file open failed〃
ErrExit:
Exit Sub
End Sub
′使文本框充滿整個窗體
Private Sub Form-Resize()
Text1.Left=0
Text1.Top=0
Text1.Width=Form1.Width-100
Text1.Height=Form1.Height-400
End Sub
---- 通過這樣的處理,不僅能解決問題,而且用戶還可以在文本框中對數據進行編輯。
---- 十一.關聯文件列表框、目錄列表框和驅動器列表框的方法

---- 想做一個對話窗體,包含驅動器列表框、目錄列表框和文件列表框,並能實現三者的同步操作,怎麼做?這都是我們在實際應用中經常會遇到的問題,在VB中解決這個問題非常簡單,可以通過Path屬性的改變引發Change事件來實現。例如:

Sub Dir1-Change()
File1.Path=Dir1.Path
End Sub

---- 該事件過程使窗體上的目錄列表框Dir1和文件列表框File1產生同步。因為目錄列表框Path屬性的改變將產生Change事件,所以在Dir1-Change事件過程中,把Dir1.Path賦給File1.Path,就可以產生同步效果。類似地,增加下面的事件過程,就可以使三種列表框同步操作:
Sub Drive1-Change()
Dir1.Path=Drive1.Drive
End Sub

---- 該過程使驅動器列表框和目錄列表框同步,前面的過程使目錄列表框和文件列表框同步,從而使三種列表框同步,問題即可解決。

閱讀全文

與systemcall源碼相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:570
python員工信息登記表 瀏覽:371
高中美術pdf 瀏覽:153
java實現排列 瀏覽:507
javavector的用法 瀏覽:976
osi實現加密的三層 瀏覽:225
大眾寶來原廠中控如何安裝app 瀏覽:906
linux內核根文件系統 瀏覽:235
3d的命令面板不見了 瀏覽:520
武漢理工大學伺服器ip地址 瀏覽:141
亞馬遜雲伺服器登錄 瀏覽:517
安卓手機如何進行文件處理 瀏覽:65
mysql執行系統命令 瀏覽:923
php支持curlhttps 瀏覽:138
新預演算法責任 瀏覽:438
伺服器如何處理5萬人同時在線 瀏覽:244
哈夫曼編碼數據壓縮 瀏覽:419
鎖定伺服器是什麼意思 瀏覽:380
場景檢測演算法 瀏覽:613
解壓手機軟體觸屏 瀏覽:343